Android中包含片段的选项卡的分隔后退堆栈

时间:2012-09-25 06:37:21

标签: android android-fragments android-tabhost android-tabactivity

由于Tab Activity已被弃用,我正在尝试使用片段实现制表符。正如您在StackOverFlow的大量问题中所看到的,当您使用片段并且具有自己的后栈时,堆栈是一个问题。

所以我要做的就是,每个标签中都有一个片段,这个片段可以在同一个标​​签中调用另一个片段,对于其他标签也是如此。

由于只有一个活动,因此整个应用程序只有一个后备堆栈。所以我需要创建我的自定义后台堆栈,每个选项卡分开。在其他问题中,这也是同样的共同点。我需要找到一种创建自定义后台堆栈的方法,但我找不到任何示例来查看。

是否有任何教程或任何示例代码执行类似的操作?提前谢谢。

2 个答案:

答案 0 :(得分:0)

整个应用程序都有一个backstack,但是还有一个片段的后台堆栈。

也许读过这个:

http://developer.android.com/guide/components/fragments.html#Transactions

执行片段事务(添加,替换或删除)时,可以将该事务添加到backstack。

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragmentContainer, fragment);
ft.addToBackStack(null);
ft.commit();

现在当您按下时,最新的片段将从片段后台堆叠中“弹出”。

您还可以覆盖onBackPressed(),并在那里管理您的片段backstack。 (我目前正在努力解决如何有效地解决这个问题。)

无论如何,FragmentManager提供了几个与backstack相关的调用。对我来说最有用的是:

FragmentManager.getBackStackEntryCount() 

FragmentManager.PopBackStack()

答案 1 :(得分:0)

对不起,迟到的答案,但这可能对某人有所帮助。我在我的项目中添加了这样的功能。我使用片段tabhost在其中添加backstack。其他主要逻辑将保持不变。

基本上我拿了,

Stack<String> fragmentStack = new Stack<>();
boolean bBackPress = false;
String strPrevTab;
FragmentTabHost tabHost;

strPrevTab = "tag"; // Add tag for tab which is selected by default
        tabHost.setOnTabChangedListener( new TabHost.OnTabChangeListener() {
            @Override
            public void onTabChanged( String tabId ) {
                if ( !bBackPress ) {
                    if ( fragmentStack.contains( tabId ) ) {
                        fragmentStack.remove( tabId );
                    }
                    fragmentStack.push( strPrevTab );
                    strPrevTab = tabId;
                }
            }
        } );

@Override
    public void onBackPressed() {
        if ( fragmentStack.size() == 0 ) {
            finish();
        } else {
            strPrevTab = fragmentStack.pop();
            bBackPress = true;
            tabHost.setCurrentTabByTag( strPrevTab );
            bBackPress = false;
        }
    }

希望这有帮助!