让我们再回到previous片段无法正常工作 [英] Going back to previous fragment not working correctly

查看:126
本文介绍了让我们再回到previous片段无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是抽屉式导航栏,当我选择一个项目,它正确替换我选择了一个previous片段,但如果我打开一个又一个,然后单击后退按钮,它去previous活动,而不是previous片段,什么是错的,它是这样做的?

 私人无效选择信息(INT位置){
    片段newFragment;
    FragmentTransaction交易= getFragmentManager()调用BeginTransaction()。
    开关(位置){
        情况下0:
            //更新
            newFragment =新UpdateFragment();
            transaction.replace(R.id.content_frame,newFragment);
            transaction.addToBackStack(NULL);
            器transaction.commit();
            listView.setItemChecked(位置,真正的);
            的setTitle(navigationDrawerItems [位置]);
            打破;
        情况1:
            //地图
            newFragment =新TimetableFragment();
            transaction.replace(R.id.content_frame,newFragment);
            transaction.addToBackStack(NULL);
            器transaction.commit();
            listView.setItemChecked(位置,真正的);
            的setTitle(navigationDrawerItems [位置]);
            打破;
        案例2:
            //时刻表
            newFragment =新TimetableFragment();
            transaction.replace(R.id.content_frame,newFragment);
            transaction.addToBackStack(NULL);
            器transaction.commit();
            listView.setItemChecked(位置,真正的);
            的setTitle(navigationDrawerItems [位置]);
            打破;
        案例3:
            //笔记
            newFragment =新TimetableFragment();
            transaction.replace(R.id.content_frame,newFragment);
            transaction.addToBackStack(NULL);
            器transaction.commit();
            listView.setItemChecked(位置,真正的);
            的setTitle(navigationDrawerItems [位置]);
            打破;
        情况4:
            //关于
            newFragment =新AboutFragment();
            transaction.replace(R.id.content_frame,newFragment);
            transaction.addToBackStack(NULL);
            器transaction.commit();
            listView.setItemChecked(位置,真正的);
            的setTitle(navigationDrawerItems [位置]);
            打破;
        情况5:
            //设置
            newFragment =新SettingsFragment();
            transaction.replace(R.id.content_frame,newFragment);
            transaction.addToBackStack(NULL);
            器transaction.commit();
            listView.setItemChecked(位置,真正的);
            的setTitle(navigationDrawerItems [位置]);
            打破;
    }
    //listView.setItemChecked(position,真正的);
    //的setTitle(navigationDrawerItems [位置]);
    drawerLayout.closeDrawer(ListView控件);
}


解决方案

您可以使用 getFragmentManager()。popBackStack()方法 onBack pressed

  @覆盖
公共无效onBack pressed(){
    如果(getFragmentManager()getBackStackEntryCount()方式> 0){
         getFragmentManager()popBackStack()。
         。getFragmentManager()调用BeginTransaction()提交()。
    }
    其他{
        super.onBack pressed();
    }
}

不要忘记添加片段BackStack这样的:

  transaction.addToBackStack(NULL);

修改

要显示动作条的当前片段的名称,你可以得到它在<​​code> onResume 您FragmentActivity的:

  @覆盖
保护无效onResume(){
    // TODO自动生成方法存根
    super.onResume();    FragmentManager fragManager = this.getSupportFragmentManager();
    诠释计数= this.getSupportFragmentManager()getBackStackEntryCount()。    //获取最后一个片段
    片段片段= fragManager.getFragments()获得(计数大于0计数1:计数)。    //请与您可能片段类
    如果(片段的instanceof OneFragment)
    {
        的setTitle(OneFragment);
    }
    否则,如果(片段的instanceof TwoFragment)
    {
        的setTitle(TwoFragment);
    }
}

希望它可以帮助ツ

I am using a navigation drawer and when I select an item, it correctly replaces the previous fragment with the one I have selected, but if I open another one, and then click the back button, it goes to the previous activity instead of the previous fragment, what is wrong that it is doing this?

private void selectItem(int position) {
    Fragment newFragment;
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    switch (position){
        case 0:
            //Update
            newFragment = new UpdateFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 1:
            //Maps
            newFragment = new TimetableFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 2:
            //Timetables
            newFragment = new TimetableFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 3:
            //Notes
            newFragment = new TimetableFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 4:
            //About
            newFragment = new AboutFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 5:
            //Settings
            newFragment = new SettingsFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
    }
    //listView.setItemChecked(position, true);
    //setTitle(navigationDrawerItems[position]);
    drawerLayout.closeDrawer(listView);
}

解决方案

You can use getFragmentManager().popBackStack() method in onBackPressed:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
         getFragmentManager().popBackStack();
         getFragmentManager().beginTransaction().commit();
    }
    else {
        super.onBackPressed();
    }
}

Don't forget to add the fragment in BackStack like :

transaction.addToBackStack(null);

Edit :

To show the current fragment name in actionbar, you can get it on onResume of your FragmentActivity :

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();

    // Fetch last fragment
    Fragment fragment = fragManager.getFragments().get(count>0?count-1:count);

    // Check with your possible Fragment class
    if( fragment instanceof OneFragment)
    {
        setTitle("OneFragment");
    }
    else if(fragment instanceof TwoFragment)
    {
        setTitle("TwoFragment");
    }
}

Hope it helps ツ

这篇关于让我们再回到previous片段无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆