0

由于选项卡活动已弃用我试图实现带有片段的选项卡。正如你在StackOverFlow的大量问题中看到的那样,当你使用碎片并且有自己的背堆栈时,背堆栈是一个问题。在Android中带有片段的选项卡的分离背堆栈

所以我试图做的事情是,每个选项卡中都有一个片段,并且此片段可以调用同一选项卡中的另一个片段,而其他选项卡也相同。

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

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

+0

http://stackoverflow.com/questions/6987334/separate-back-stack-for-each-tab-in-android-using-fragments – Krishnabhadra

回答

0

整个应用程序有一个backstack,但也有一个用于碎片的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中有几个可以与后台进行通话。最有用的我是:

FragmentManager.getBackStackEntryCount() 

FragmentManager.PopBackStack() 
+1

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

0

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

基本上我拿了,

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

希望这有助于!