0

如果我像这样向我的活动添加片段:

    fragment_tags = new ArrayList<String>();
    fragment_tags.add("user_fragment");
    fragment_tags.add("memorial_fragment");

    UserFragment user = new UserFragment();
    MemorialFragment memorial = new MemorialFragment();

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

    ft.add(R.id.content_frame, user, fragment_tags.get(0));
    ft.add(R.id.content_frame, memorial, fragment_tags.get(1));
    ft.commit();

然后过了一段时间我试图检索这些片段是这样的:

    List<Fragment> frg = getSupportFragmentManager().getFragments();
    Fragment fragUser = getSupportFragmentManager().findFragmentByTag(
            "user_fragment");
    Fragment fragUserID = getSupportFragmentManager().findFragmentById(
            R.id.user_fragment_id);
            Log.d("MV", "fragments size:" + (frg == null ? " null" : frg.size()));

Log.d 将始终返回 2 的大小,但 fragUser 有时为空,有时它是我放入事务的片段。

更有趣的是这段代码:

    try {
        Log.d("MV", "0:" + frg.get(0).toString());
        Log.d("MV", "1:" + frg.get(1).toString());
    } catch (NullPointerException e) {
        Log.d("MV", "null caught");
    }

有时适用于两个片段,有时只适用于第一个片段,如果我这样做:

if(frg.get(0) == fragUser)

它有时会被评估为真实,但不经常..我不太了解这种行为,但我需要实现多个片段之间的切换,所以我需要获取对确切片段的引用。有人吗?我现在尝试解决这个问题 6 个小时,但我真的不明白该怎么做。谢谢

4

1 回答 1

0

由于这个问题是我在 2013 年发布的,获得了超过 1000 次浏览但仍然没有任何回应,我将尝试总结这些年来我在处理片段时所学到的东西。

  1. 不要使用 getSupportFragmentManager().getFragments() (getSupportFragmentManager().getFragments() 中的更多内容显示编译时错误
  2. FragmentManager 用于管理片段生命周期。不要试图将片段放入您自己的列表中或保持对它们的强引用
  3. 无法始终如一地工作的原因if(frg.get(0) == fragUser)与第 2 点有关。 - FragmentManager 管理片段,因此当它决定杀死一个并重新创建它时,引用将不匹配。

现在的问题 - 如何安全地使用片段?

  1. 使用 setArguments() 方法将数据传递给 bundle 中的片段,因此 Android 可以杀死并重新创建片段。
  2. FragmentManager.findFragmentById(R.id.some_id)将找到附加到 id 为 some_id 的视图的片段。如果您将多个片段添加到 R.id.some_id 中,很可能FragmentManager.findFragmentById(R.id.some_id)会给出不同的结果(但这通常是找出哪个片段当前可见的非常好的方法,除非您还隐藏/显示您的片段)
  3. 了解 FragmentTransaction API 的不同方法,尤其是addreplacehidedetachremove之间的区别show
  4. 有时事情只是不起作用(当多个片段过渡动画同时运行时崩溃)或者您的应用程序不是片段的好用例。您可以在现在的经典帖子https://medium.com/square-corner-blog/advocating-against-android-fragments-81fd0b462c97中阅读有关后者的更多信息
于 2017-06-10T23:35:33.413 回答