FragmentActivity and Fragments: popBackStack



我的FragmentActivity管理tabhost内的4个listfragment(对于每个listfragment,我保持其backstack的跟踪)。ListFragment共享一个FrameLayout,其中附加了它们的内容。当onlisttitemclick被触发时,让FragmentActivity启动一个新的Fragment,以便当前片段的内容被新片段取代。如果你调用A片段当前显示(由ListFragment A管理)和B的片段,将取代A(例如由ListFragment B管理)发生在片段之间切换时,内容A与B的内容重叠,至少我清除了片段的backstack关闭(在例子中的A)。在片段之间我做

    if (activeTab != tv) {
        if (activeTab != null) {
            Log.i(TAG, "tag: " + activeTab.getTag() + " detaching...");
            FragmentInfo fragmentInfo = fragments.get(activeTab.getTag());
            //detach the current fragment
            //getSupportFragmentManager().popBackStack((String)activeTab.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
            ft.detach(fragmentInfo.fragment);
        }
        //get the new 
        FragmentInfo fragmentInfo = fragments.get(tv.getTag());
        Log.i(TAG, "tag: " + tv.getTag() + " fragment: " + fragmentInfo.mClass.getName());
        if (fragmentInfo != null) {
            if (fragmentInfo.fragment == null) {
                fragmentInfo.fragment = Fragment.instantiate(this, fragmentInfo.mClass.getName(), fragmentInfo._args);
                ft.add(R.id.mytabcontent, fragmentInfo.fragment, fragmentInfo._tag);
            } else {
                Log.i(TAG, "attacching fragment: " + fragmentInfo.mClass.getName());
                ft.attach(fragmentInfo.fragment);
            }
        }
    }

而当我需要改变listfragment内容时,OnListemItemClick被触发,我使用

    private void replaceFragment(Fragment fragment, String tag, String backstack) {
    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.mytabcontent, fragment, tag);
    ft.setTransition(FragmentTransaction.TRANSIT_NONE);
    ft.addToBackStack(backstack);
    ft.commit();
}

你能帮我理解为什么吗?提前感谢,抱歉我的英语不好

编辑:我的问题是为什么我需要清除backstack每次我之间切换ListFragment,以避免片段重叠的内容。我做错了什么

好的,那么这个答案假设您希望在每次交换选项卡时擦除每个选项卡的历史记录。我的意思是,Tab 1从碎片1开始,然后点击并将其更改为碎片2。如果您选择了Tab 2,您将取消Tab 1的历史记录,下次单击Tab 1时,您将返回到片段1。

下面是解决方案:将onTabUnselected替换为下面的
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            //this segment removes the back history of everything in the tab you are leaving so when you click on the tab again you go back to a fresh start
            FragmentManager man = mActivity.getFragmentManager();
            if(man.getBackStackEntryCount()>0) //this check is required to prevent null point exceptions when clicking off of a tab with no history
                man.popBackStack(man.getBackStackEntryAt(0).getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE); //this pops the stack back to index 0 so you can then detach and then later attach your initial fragment
            //also it should be noted that if you do popbackstackimmediate here instead of just popbackstack you will see a flash as the gui changes back to the first fragment when the code executes
            //end
            ft.detach(mFragment);
        }
    }

最新更新