0

由于不推荐使用选项卡活动,我正在尝试使用片段实现选项卡。正如您在许多 StackOverFlow 问题中看到的那样,当您使用 Fragment 并且它有自己的 back stack 时,back stack 是一个问题。

所以我想做的是,每个选项卡中有一个片段,这个片段可以调用同一个选项卡中的另一个片段,其他选项卡也一样。

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

是否有任何教程或任何示例代码做类似的事情?提前致谢。

4

2 回答 2

0

整个应用程序都有一个backstack,但也有一个fragment 的backstack。

也许读过这个:

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

当您执行片段事务(添加、替换或删除)时,您可以将该事务添加到后台堆栈。

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

现在,当您按下返回时,最新的片段将从片段回栈中“弹出”。

您还可以覆盖 onBackPressed(),并在那里管理您的片段回栈。(我目前在试图弄清楚如何有效地做到这一点时遇到了麻烦)。

无论如何,FragmentManager 有几个调用可用于处理 backstack。对我最有用的是:

FragmentManager.getBackStackEntryCount() 

FragmentManager.PopBackStack()
于 2012-09-25T06:51:20.167 回答
0

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

基本上我拿了,

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

希望这可以帮助!

于 2017-02-20T18:29:35.120 回答