android - 如何压缩与 fragment 标签匹配的后台 fragment ?

标签 android android-fragments back-stack fragmentmanager

我的 Android 平板电脑应用的布局由项目列表和详细信息 View 组成。选择列表项后,相关内容将显示在详细信息 View 中。

+--------+-------------+ 
| Item 1 |             |
+--------+    Item     |
| Item 2 |   details   |
+--------+             |
| Item 3 |             |
+--------+-------------+

详细信息 View 是一个 Fragment,它以编程方式扩展到 FrameLayout 占位符中:

<FrameLayout
    android:id="@+id/detail_fragment_placeholder"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

这是Fragment操作:

getSupportFragmentManager()
    .beginTransaction()
    .replace(containerViewId, fragment, fragmentTag)
    .addToBackStack(backStackStateName)
    .commit();

DetailsFragment 的多个实例 [Dx] 会在用户依次选择一个项目时添加到后台堆栈。

                [D3]
        [D2]    [D2]
[D1] -> [D1] -> [D1]

因此,用户需要多次按下BACK按钮,将实例从后台栈中弹出,清空详细信息 View 。

当现有 fragment 匹配新 fragmentfragmentTag

[D1] -> [D2] -> [D3]

最佳答案

我不确定我是否正确理解了您的问题。如果您想用带有相同标签的单个 fragment 替换来自后台堆栈顶部的带有某个标签的多个 fragment ,那么您可以使用以下方法。

不是使用标签来识别 fragment ,而是为不同类型的 fragment 设置不同的后台堆栈名称。您仍然可以使用 fragment 标签,但它无助于解决这个特定问题。然后手动从后台堆栈中逐个删除 fragment ,直到顶部有一个具有不同后台堆栈名称的 fragment 或没有 fragment 为止。

  public void addFragment(final int containerViewId, final Fragment fragment,
      final String backStackName, final boolean replace) {
    final FragmentManager fragmentManager = getSupportFragmentManager();

    if (replace) {
      while (fragmentManager.getBackStackEntryCount() > 0) {
        final int last = fragmentManager.getBackStackEntryCount() - 1;
        final FragmentManager.BackStackEntry entry = 
            fragmentManager.getBackStackEntryAt(last);
        if (!TextUtils.equals(entry.getName(), backStackName)) {
          break;
        }

        fragmentManager.popBackStackImmediate();
      }
    }

    fragmentManager
        .beginTransaction()
        .replace(containerViewId, fragment)
        .addToBackStack(backStackName)
        .commit();
    fragmentManager.executePendingTransactions();
  }

现在,如果您进行以下调用,您的后台堆栈将仅包含 fragment1fragment4

addFragment(R.id.container, fragment1, "D2", false);
addFragment(R.id.container, fragment2, "D1", false);
addFragment(R.id.container, fragment3, "D1", false);
addFragment(R.id.container, fragment4, "D1", true);

更新:

在这种特殊情况下,以下代码就足够了:

getSupportFragmentManager().popBackStack(
    backStackStateName, FragmentManager.POP_BACK_STACK_INCLUSIVE);
getSupportFragmentManager()
    .beginTransaction()
    .replace(containerViewId, fragment, fragmentTag)
    .addToBackStack(backStackStateName)
    .commit();

https://github.com/tuxmobil/CampFahrplan/pull/148

关于android - 如何压缩与 fragment 标签匹配的后台 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34953590/

相关文章:

Android后退按钮从后台带来错误的 fragment

android - Android 中维护标准应用程序 Activity 返回堆栈状态(使用 singleTask 启动模式)

android - NativeScript 在 Mac OS 上找不到 Android SDK

java - 音频编程、声音处理和 DSP

java - 检索 JSON 对象 Android

java - 用于填充多个部分的 Android GridView 适配器

android - 将 ArrayList 从 Activity 传递到 ListFragment?

java - 如何将数据从 Recyclerview 传递到 Fragment

android - 从后台弹出时不调用 fragment 的 onResume()

android - 启动另一个应用程序的 Activity