【问题标题】:Previous fragment visible below new fragment上一个片段在新片段下方可见
【发布时间】:2015-09-23 12:04:28
【问题描述】:

我有一个带有 ViewPager 的 TabLayout。 ViewPager 有四个片段 F1、F2、F3 和 F4。 F1 包含一个 FrameLayout,它可以有 2 个片段 F11 和 F12。最初我用下面的代码在 FrameLayout 中添加 F11。

Fragment11 fragment11 = new Fragment11();
fragment11.setArguments(getActivity().getIntent().getExtras());
getActivity().getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, fragment11, Constants.FRAGMENT_11)
                .commit();

F11 包含一个 ListView。当我单击此 ListView 中的任何项目/行时,F11 将替换为 F12。 F12 是一个细节片段。

Fragment12 fragment12 = new Fragment12();
FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment12, Constants.FRAGMENT_12)
                    .addToBackStack(null)
                    .commit();

对于正常的应用程序流程,它可以正常工作。现在假设目前我在 Fragment12 中并且我按下了主页按钮。现在我打开任何繁重的应用程序(相机或任何其他应用程序)以从内存中删除我的应用程序。现在我再次启动了我的应用程序。

现在有两个 Fragment11 和一个 Fragment12 是同时可见的。当我按下后 Fragment12 被删除,现在两个 Fragment11 是可见的。当我单击 Fragment11 的 ListView 行时,顶部的 Fragment11 将替换为 Fragment12,但是底部的 Fragment11 仍然存在。

这就是我想要的: 当应用程序从后台进入前台时,Fragment12 应该是可见的,当我按下返回时,Fragment12 应该会弹出以显示 Fragment11。

我该怎么做?

【问题讨论】:

  • 在添加这两个嵌套片段时,您可能需要使用正确的 FragmentManager getChildFragmentManager()。
  • @Luksprog 如果我改用 getChildFragmentManager(),我找不到 R.id.fragment_container。它的例外。 java.lang.IllegalArgumentException:找不到片段 Fragment12 的 id 0x7f0e014c (com.demo:id/fragment_container) 的视图
  • 如果这些片段在另一个片段的布局中使用,那么您需要使用 getChildFragmentManager()。如果您收到该错误,则说明您的代码/布局有问题。您没有发布太多代码,但另一个问题是在将 F11 和 F12 添加到布局之前,您是否在 getChildFragmentManager() 中有可用的 检查(或者您盲目地添加这些使用当前代码构造父实例时的片段)?

标签: android listview android-fragments


【解决方案1】:

我知道为时已晚,但这个答案可以帮助其他人。这不是一个合适的解决方案,但它对我有用。所以将android:clickable="true"android:background="?android:attr/colorBackground" 放在片段的根视图中。希望这会奏效。

【讨论】:

    【解决方案2】:

    我也遇到过同样的问题。但我也找不到合适的解决方案。在我的场景中,当我打开多个应用程序并且它们返回到我的应用程序时,它会导致与您身边发生的片段相同的问题。但我让我的应用程序稳定了。我通过以下解决方案做到了这一点:

    1. 当您的应用从内存中删除然后再次打开应用时,您会在其中显示 Fragments 的 MainActivity 调用 onCreate() 方法。

    2. 这里我检查了 backstackEntrycount,如果它大于 0,则删除所有片段并显示基本片段。

      // Clear all fragments and show base fragment, So it will not create
      // issue after opening
      // multiple apps
      FrameLayout flSliding = (FrameLayout) findViewById(R.id.fl_sliding);
      flSliding.post(new Runnable() {
      
          @Override
          public void run() {
              FragmentManager fragmentManager = getSupportFragmentManager();
              Log.i("NavigationDrawerActivity",
                      "onCreate " + fragmentManager.getBackStackEntryCount());
              if (fragmentManager.getBackStackEntryCount() > 0) {
                  removeFragment(fragmentManager.getBackStackEntryCount());
              }
              Log.i("NavigationDrawerActivity",
                      "onCreate " + fragmentManager.getBackStackEntryCount());
          }
      });
      

    希望它会有所帮助!

    【讨论】:

    • 以上代码对我没有帮助。当应用程序再次启动时,三个片段 F11、F11 和 F12 可见。当我使用您的代码时,可以看到两个片段,F11 和 F11。我不明白发生了什么。 Gmail应用程序解决了同样的问题。 Gmail 有两个片段,邮件列表和详细邮件。当我从详细信息片段关闭应用程序时,再次进入应用程序后会显示详细信息片段而不是电子邮件列表。他们是如何处理的?
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多