【问题标题】:Going back to previous fragment not working correctly返回上一个片段无法正常工作
【发布时间】:2014-12-10 20:41:09
【问题描述】:

我正在使用导航抽屉,当我选择一个项目时,它会正确地将前一个片段替换为我选择的片段,但是如果我打开另一个片段,然后单击后退按钮,它会转到上一个活动之前的片段,它这样做有什么问题?

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);
}

【问题讨论】:

    标签: android android-fragments back


    【解决方案1】:

    您可以在onBackPressed 中使用getFragmentManager().popBackStack() 方法:

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

    不要忘记在 BackStack 中添加片段,例如:

    transaction.addToBackStack(null);
    

    编辑:

    要在操作栏中显示当前片段名称,您可以在 FragmentActivity 的onResume 上获取它:

    @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");
        }
    }
    

    希望对你有所帮助ツ

    【讨论】:

    • 这很好,虽然当我按下后退按钮时,我的活动标题确实反映了从 backStack 加载的当前片段?
    • @MysticMagic 这很不错,虽然当我按下后退按钮时,我的活动标题确实反映了从 backStack 加载的当前片段?
    • 要反映名字吗??
    • 我希望工具栏标题在旧片段再次加载时更改。我通常用这个 setTitle(navigationDrawerItems[position]); 来做,但那是在开关内部,所以它不会被调用。 @SweetWisher
    • 可以在onResume获取当前Fragment并相应设置标题
    【解决方案2】:

    您正在将 null 添加到后台堆栈 -

    transaction.addToBackStack(null);
    

    用你的片段的标签名称替换这个空值。

    它会起作用的。

    【讨论】:

    • 不,你可以给这个方法设置null。如果它为空也没关系。
    • 根据文档,为了记住交易,我们会将其添加到 backstack - developer.android.com/reference/android/app/…
    • 这里设置null会添加fragment到backstack,设置string也会添加fragment到backstack。
    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多