【问题标题】:findFragmentByTag return null fragmentfindFragmentByTag 返回空片段
【发布时间】:2016-05-10 19:07:33
【问题描述】:

我有这个非常简单的代码:

    InboxFragment ibf = new InboxFragment();
    getFragmentManager().beginTransaction().add(ibf, InboxFragment.TAG);
    getFragmentManager().beginTransaction().commit();

    InboxFragment ib2 = (InboxFragment) getFragmentManager().findFragmentByTag(InboxFragment.TAG);

我不明白为什么我的ib2 为空。

在我的活动中管理不同片段的最佳方式是什么?因为我必须实现一个“模板”系统,每个模板都由一个片段来表示。我必须在模板之间切换。

  • 第一次声明我的所有片段,并在模板更改时调用好的片段。 (如果模板没有改变,就不要记忆了)
  • 在模板更改时添加片段。 (当我销毁片段时,我该如何回忆它,实例存储在哪里)。

感谢您的帮助。

【问题讨论】:

  • 检查this。将您的标签添加到 backstack getFragmentManager().beginTransaction().addToBackStack(InboxFragment.TAG);
  • 你为什么不打电话给commit
  • 如果我在 'add()' 之后调用 commit(),效果相同
  • 尝试调用executePending

标签: android android-fragments


【解决方案1】:

See here

FragmentTransactionFragmentTransaction.commit() 一起提交后,它被安排在进程的主线程上异步执行。如果您想立即执行任何此类挂起的操作,您可以调用此函数(仅从主线程)来执行此操作。

所以添加这个

.executePendingTransactions() 承诺执行此类操作后。

【讨论】:

  • .executePendingTransactions()的结果相同
  • 确保在提交后调用它,fragmentTransaction.commit();fragmentManager.executePendingTransactions() 也确保它。尽量不要链接它们。拆分它们。
【解决方案2】:

每次调用 getFragmentManager().beginTransaction() 时,都会创建一个新的 FragmentTransaction 实例。

你永远不会提交第一笔交易:

getFragmentManager().beginTransaction().add(ibf, InboxFragment.TAG);

但只有第二个(空的)一个:

getFragmentManager().beginTransaction().commit();

改写以下行:

getFragmentManager().beginTransaction().add(ibf, InboxFragment.TAG).commit();

除此之外,如果您在添加Fragment 后立即调用findFragmentByTag()FragmentManager 将返回 null,因为默认情况下添加 Fragment 将异步执行。可以添加以下语句强制执行(但可能会导致性能不佳):

getFragmentManager().executePendingTransactions();

在您的代码中,您只需编写即可获得相同的结果(初始化 ib2)

ib2 = ibf;

关于您的“模板系统”:我认为只创建必要的内容是一种很好的做法。一旦创建了对象,最好保留它们(取决于应用程序)。 Retained Fragments 可能对您的情况有所帮助,但建议将它们主要用于存储数据,而不是用于保留 UI 元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多