Android ViewPageAdapter,每个选项卡都有一个单独的backstack

Sta*_*ley 7 android android-fragments android-viewpager

我有一个Android应用程序,只有一个活动.该活动包含一个带有ViewPageAdapter的SlidingTabLayout,如例所示.每个选项卡都包含一个相应的根片段,然后当用户使用该屏幕时,我将其替换为其他片段.可视化表示如下所示:

在此输入图像描述

使用我当前的实现,我执行以下操作:转到tab1,通过将ProductRootFragment替换为ProductListFragment立即加载ProductListFragment.我点击了一个产品,它用ProductDetailFragment替换了ProductListFragment.现在我切换到tab2并通过替换Tab2RootFragment立即加载Tab2ListFragment.我单击一个项目,Tab2DetailFragment替换Tab2ListFragment.我现在返回到Tab1,正如我所料,仍然显示ProductDetailFragment.但是,如果我现在单击后退按钮,它不会像我期望的那样将我带回到ProductListFragment.相反,它从Backstack中弹出Tab2DetailFragment.

我想为每个"tab"片段实现一个单独的backstack.有几个关于这个的帖子,但它们似乎都已经过时了,有些人提出了非常精细的解决方案.(见这里,这里这里 ......)

似乎在最新版本的SDK中,Android可以自动处理这种backstack层次结构,而无需在我更换片段的事务中使用getChildFragmentManager而不是getSupportFragmentManager来手动实现某种后台堆栈.但是,我无法让它发挥作用.(我直觉地认为正确的解决方案就是让Android处理这个问题,因为感觉就像手动覆盖后退按钮并实现自己的堆栈一样精心设计.)

有人可以解释如何正确实现预期的行为,其中为每个选项卡维护单独的backstack?或者可能链接到一个简单,精心设计和最新的如何实现所需行为的示例?

有关我的代码的其他信息:在我的MainActivity.java中,我使用getSupportFragmentManager()构造ViewPagerAdapter.

ViewPagerAdapter.java

@Override
public Fragment getItem(int position) {
    switch(position){
        case 0: return new ProductRootFragment();
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

ProductRootFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.product_root_fragment, container, false);

    FragmentTransaction transaction = getFragmentManager()
            .beginTransaction();
    transaction.replace(R.id.product_root_container, new ProductListFragment());
    transaction.commit();
    return view;
}
Run Code Online (Sandbox Code Playgroud)

ProductListFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View layout = inflater.inflate(R.layout.product_list_fragment, container, false);
    view = (ProductListView) layout;
    return view;
}
...
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    ...
    ProductDetailFragment newFragment = new ProductDetailFragment();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.product_root_container, newFragment);
    transaction.addToBackStack(null);
    transaction.commit();
}
Run Code Online (Sandbox Code Playgroud)

ProductDetailFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = (ProductDetailView) inflater.inflate(R.layout.product_detail_fragment, container, false);
    return view;
}
Run Code Online (Sandbox Code Playgroud)

Ume*_*wat 0

您遇到此问题是因为每次替换片段时都会将该片段添加到后台堆栈中。为片段维护 Backstack 取决于添加片段的活动。所以每次你做的时候addToBackStack()都保持相同的活动。当您尝试使用场景时,位于后台堆栈顶部的最后添加的片段是 Tab2DetailFragment。要解决这个问题,您需要在每次切换到其他选项卡时清除后台堆栈。请记住,您需要清除后台堆栈而不是活动中的所有片段。