Android中带有片段的标签的分离后台堆栈

Android中带有片段的标签的分离后台堆栈,android,android-fragments,android-tabhost,android-tabactivity,Android,Android Fragments,Android Tabhost,Android Tabactivity,由于不推荐使用Tab活动,所以我尝试使用片段实现Tab。正如您在大量StackOverFlow问题中所看到的,当您处理片段时,后堆栈是一个问题,它有自己的后堆栈 所以我要做的是,每个选项卡中都有一个片段,这个片段可以调用同一个选项卡中的另一个片段,其他选项卡也是如此 因为只有一个活动,所以整个应用程序只有一个后台堆栈。因此,我需要创建我的自定义后台堆栈,它是为每个选项卡分开的。这也是其他问题中的共同观点。我需要找到一种创建自定义后堆栈的方法,但我找不到任何示例来查看 有没有类似的教程或示例代码?

由于不推荐使用Tab活动,所以我尝试使用片段实现Tab。正如您在大量StackOverFlow问题中所看到的,当您处理片段时,后堆栈是一个问题,它有自己的后堆栈

所以我要做的是,每个选项卡中都有一个片段,这个片段可以调用同一个选项卡中的另一个片段,其他选项卡也是如此

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


有没有类似的教程或示例代码?提前感谢。

整个应用程序都有一个backbackback,但片段也有一个backbackback

或许你可以读一读:

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

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragmentContainer, fragment);
ft.addToBackStack(null);
ft.commit();
现在,当你按下back键时,最新的碎片将从碎片背面“弹出”

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragmentContainer, fragment);
ft.addToBackStack(null);
ft.commit();
您还可以重写onBackPressed(),并在那里管理片段backbackback。(我目前很难找到有效的方法)

无论如何,FragmentManager可以打几个电话来处理backbackback。对我来说最有用的是:

FragmentManager.getBackStackEntryCount() 


很抱歉回答晚了,但这可能会对某些人有所帮助。我在我的项目中添加了类似的功能。我使用fragment tabhost在其中添加了backbackback。其他方面的主要逻辑将保持不变

基本上我拿了

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;
        }
    }
Stack fragmentStack=new Stack();
布尔bBackPress=false;
字符串strPrevTab;
碎片tabHost tabHost;
strPrevTab=“标记”//为默认选中的选项卡添加标记
tabHost.setOnTabChangedListener(新tabHost.ontabchangedListener(){
@凌驾
已更改的公共无效项(字符串选项卡ID){
如果(!bBackPress){
if(fragmentStack.contains(tabId)){
fragmentStack.remove(tabId);
}
fragmentStack.push(strPrevTab);
strPrevTab=tabId;
}
}
} );
@凌驾
public void onBackPressed(){
if(fragmentStack.size()==0){
完成();
}否则{
strPrevTab=fragmentStack.pop();
bBackPress=true;
tabHost.setCurrentTabByTag(strPrevTab);
bBackPress=false;
}
}

希望这有帮助

谢谢你的回答,但这不是我要问的问题。让我说清楚;假设我有一个带有tab主机的应用程序,每个tab都由一个片段(而不是一个活动)表示。所以问题是,假设用户在第一个选项卡中,并且用户将调用同一选项卡中的另一个片段(我们仍然在第一个选项卡中)。之后,用户将把选项卡更改为第二个选项卡,并在“第二个选项卡”中调用另一个片段。因此,在用户按下后退按钮的情况下,片段管理器将弹出最新的片段