当我尝试在我的应用程序中使用嵌套片段的后台堆栈时,发生了奇怪的行为。
假设我有这个片段 FragmentA,它以编程方式放置在另一个 rootFragment 内部,其线性布局旨在容纳片段。
rootFragment 的布局包含:
<LinearLayout
android:id="@+id/map_fragmentHolder"
android:layout_height="0dp"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_weight="1.5" />
我使用我的 switchToFragment 方法(如下所述)将 FragmentA 替换为 FragmentB 类型的片段。
public void switchToFragment(Fragment fragment, boolean addtoBackStack) {
//Perform the fragment switch
FragmentTransaction childTransaction = rootFragment.getChildFragmentManager().beginTransaction();
childTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE |
FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
childTransaction.replace(R.id.map_fragmentHolder, fragment);
if(addtoBackStack){
if(currentFragment != null)
fragmentStack.push(currentFragment);
childTransaction.addToBackStack(null);
}
currentFragment = fragment;
childTransaction.commit();
}
当替换 currentFragment 的片段是不同类型时,这非常有效。但是由于某些奇怪的原因,如果我在当前添加了一个 FragmentB 类型的片段时尝试切换另一个片段,则后堆栈突然停止工作。不是替换线性布局中的所有片段,而是将旧片段放置在当前片段下方。
这是我如何调用返回堆栈弹出。这样做是因为 onBackPressed() 方法默认不处理嵌套片段上的回栈。
public boolean onBackPressed() {
if(fragmentStack.size() == 0)
return false;
//ChildFragmentManagers don't pop the backstack automatically, so we gotta do it manually...
rootFragment.getChildFragmentManager().popBackStack();
currentFragment = fragmentStack.pop();
return true;
}
如果我简单地用以下方法替换我的 onBackPressed 方法,我已经设法使我的应用程序工作,但是我真的很想知道发生了什么,以及为什么它只在我用相同类型的一种替换片段时发生。
public boolean onBackPressed() {
if(fragmentStack.size() == 0)
return false;
switchToFragment(fragmentStack.pop(), false);
return true;
}
任何想法或见解将不胜感激。