片段交互回调:onAttach() vs setter

Posted

技术标签:

【中文标题】片段交互回调:onAttach() vs setter【英文标题】:Fragment interaction callbacks: onAttach() vs setter 【发布时间】:2017-11-19 02:13:13 【问题描述】:

我正在尝试实现一个不错的、可重复使用的 Fragment,但我很难选择设置交互回调的模式。我当然熟悉the docs,但我对其中描述的方法有些怀疑。

假设我们有一个带有回调接口的 Fragment:

public class MyFragment extends Fragment 
    private Callbacks mCallbacks;
    public static interface Callbacks  /* ... */ 

到目前为止,我遇到了两种为 Fragments 设置回调的方法。

1。在onAttach() 中投射上下文

android 开发指南中描述的方式。

@Override
public void onAttach(Context context) 
    super.onAttach(context);
    try 
        mCallbacks = (Callbacks) context;
     catch (ClassCastException e) 
        throw new ClassCastException(context.toString() + " must implement Callbacks");
    

优点:

无需编写太多代码 mCallbacks 永远不会为空(只要 Fragment 还活着)

缺点:

如果我们在 Activity 中使用多个 Fragment 会变得混乱 尝试使用同一 Fragment 类的多个实例时发生冲突 使用嵌套片段时出现奇怪的流程

2。二传手

简单的侦听器模式。

public void setCallbacks(Callbacks callbacks) 
    mCallbacks = callbacks;

优点

可以从任何地方设置和替换回调 可以使用匿名(或内部静态)回调类

缺点

在调用回调方法之前需要进行空检查 在 Fragment 重新创建时不会自动绑定(通过在 Activity 的 onAttachFragment 中设置回调很容易解决)

我发现第一种方法不如第二种方法,因为它引入了不必要的限制,并且在某种程度上违反了 LoD,要求回调方法由附加到 Fragment 的 Activity 实现。它还通过强制将回调一直发送到 Activity 而不仅仅是父 Fragment 来使与嵌套 Fragment 的交互变得复杂。再说一次,这是 Android 开发指南中建议的方法。我在这里遗漏了什么吗?

很长的问题,实现片段回调的最佳实践是什么?

【问题讨论】:

mCallbacks 永远不会为空 不是真的 ... @Selvin 我指的是 Fragment 的生命周期,已修复 @SpaceBicon,对于第二种方法,你能解释一下如何通过在onAttachFragment中设置回调来轻松修复它吗? @efeyc 在父 Acitivity 的 Activity.onAttachFragment(Fragment) 中,您可以检查 Fragment 的类(如果需要区分共存实例,则标记)并相应地设置监听器。 我已编辑问题以澄清我的意思是Activity.onAttachFragment 而不是Fragment.onAttachFragment 【参考方案1】:

我通常使用官方记录的方法。在极少数情况下,当它不太适合我的应用程序结构\复杂性时,我发现 EventBus 模型通常工作得很好。

https://github.com/greenrobot/EventBus

【讨论】:

以上是关于片段交互回调:onAttach() vs setter的主要内容,如果未能解决你的问题,请参考以下文章

OnDetach/onAttach 片段重新创建片段活动

片段的 onAttach 中的值的可能性是啥

替换未调用 onAttach、onCreate、onCreateView 等的活动中的片段

Dagger 2:在片段中调用onAttach之前,注入的对象可能仍为null

是否最好使用 Activity.onAttachFragment 或 Fragment.onAttach 在 Activity 和嵌套片段之间进行通信?

关于Activity和Fragment生命周期的问题