【问题标题】:Why is this fragment's fields null?为什么这个片段的字段为空?
【发布时间】:2016-08-29 04:52:35
【问题描述】:

在我的父 Fragment 的 onCreateView 方法中,我调用 Child Fragment Manager 将 Fragment 插入到布局中。这个子片段包含一些 FloatingActionButtons。

提交事务后,我会检查底层列表的内容(为 RecyclerView 提供支持),并根据是否存在任何值,隐藏/取消隐藏一些 FloatingActionButton。

但是它告诉我按钮是空的!提交 Fragment 事务是否不会首先调用其所有典型的生命周期事件?有没有办法强迫它等待?有没有更好的做法?

【问题讨论】:

  • 我相信您也可以在片段管理器上调用executePendingTransactions(),片段的onCreateView() 将作为其中的一部分被调用。并不是说这是documentation 中警告的最佳方式,但它可能是一种选择。
  • @GeorgeMulligan 这似乎对我不起作用
  • 这真是令人沮丧,在Android中做这么简单的事情应该不难
  • 我从未尝试过使用子片段,但它适用于为我添加到活动中的片段。但是,我不确定onCreateView() 是否保证被称为其中的一部分,或者它是否恰好发生在我的情况下,或者您尝试使用子片段执行此操作的事实是否有所不同。无论如何,您似乎应该能够修改 Jeffrey Blattman 的答案以满足您的需求。如果某些事情不起作用,您可能应该在您的问题中添加一些代码,说明您当前如何尝试这样做,以确保其他事情没有错。
  • 我看不出这个答案与我正在尝试做的事情有什么关系。如果父片段中的列表为空/非空,我要做的就是修改子片段中某些按钮的可见性。就是它。

标签: android android-fragments fragmenttransaction fragmentmanager


【解决方案1】:

提交不是同步的。无法保证片段的生命周期何时执行。

如果您需要知道片段何时“准备就绪”,请实现从片段到托管活动的回调,让它知道。

class CustomB extends CustomA { 
  interface Listener {
    void onViewCreated();
  }

  public View onCreateView() {
     View v = super.onCreateView();

     if (getActivity() instanceof Listener) {
       ((Listener)getActivity()).onViewCreated();
     }

     return v;
  }
}

一般来说,您应该尝试将片段设计为自包含的。如果片段与活动紧密绑定,请考虑将功能实现为自定义View

【讨论】:

  • 包含 FloatingActionButtons 的片段在应用程序的多个不同位置使用,这就是我将其设为片段的原因。由于在这种情况下它在某种程度上与 Activity 绑定,我会改为扩展它?
  • 如果你不能修改原来的片段,是的,你可以通过扩展轻松添加我上面写的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多