由于Tab Activity已被弃用,我正在尝试使用片段实现制表符。正如您在StackOverFlow的大量问题中所看到的,当您使用片段并且具有自己的后栈时,堆栈是一个问题。
所以我要做的就是,每个标签中都有一个片段,这个片段可以在同一个标签中调用另一个片段,对于其他标签也是如此。
由于只有一个活动,因此整个应用程序只有一个后备堆栈。所以我需要创建我的自定义后台堆栈,每个选项卡分开。在其他问题中,这也是同样的共同点。我需要找到一种创建自定义后台堆栈的方法,但我找不到任何示例来查看。
是否有任何教程或任何示例代码执行类似的操作?提前谢谢。
答案 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;
}
}
希望这有帮助!