【发布时间】:2015-11-12 11:38:24
【问题描述】:
我有一个只有一个 Activity 的 Android 应用。该活动包含一个带有 ViewPageAdapter 的 SlidingTabLayout,如 this 示例中所示。每个选项卡都包含一个相应的根片段,然后在用户使用该屏幕时将其替换为其他片段。如下图所示:
使用我当前的实现,我执行以下操作:转到 tab1,通过将 ProductRootFragment 替换为 ProductListFragment 立即加载 ProductListFragment。我单击一个产品,它将 ProductListFragment 替换为 ProductDetailFragment。现在我切换到 tab2 并且 Tab2ListFragment 通过替换 Tab2RootFragment 立即加载。我单击一个项目,Tab2DetailFragment 替换了 Tab2ListFragment。我现在返回 Tab1,正如我所料,ProductDetailFragment 仍然显示。但是,如果我现在单击后退按钮,它不会像我预期的那样将我带回 ProductListFragment。相反,它会从后台弹出 Tab2DetailFragment。
我想为每个“标签”片段实现一个单独的后台堆栈。已经有几篇关于这个的帖子,但它们似乎都已经过时了,有些人提出了非常复杂的解决方案。 (见here、here和here...)
似乎在最新版本的 SDK 中,Android 可以自动处理这个 backstack 层次结构,而无需在我替换片段的事务中使用 getChildFragmentManager 而不是 getSupportFragmentManager 手动实现某种 backstack。但是,我无法让它发挥作用。 (我直觉上认为正确的解决方案是让 Android 处理这个问题,因为感觉手动覆盖后退按钮并实现自己的堆栈是一种精心设计的 hack。)
有人可以解释如何正确实现为每个选项卡维护单独的后台堆栈的预期行为吗?或者也许链接到一个简单的、精心设计的和最新的示例,说明如何实现所需的行为?
关于我的代码的其他信息: 在我的 MainActivity.java 中,我使用 getSupportFragmentManager() 构造 ViewPagerAdapter。
ViewPagerAdapter.java
@Override
public Fragment getItem(int position) {
switch(position){
case 0: return new ProductRootFragment();
...
}
...
}
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;
}
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();
}
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;
}
【问题讨论】:
标签: android android-fragments android-viewpager