当前位置: 首页 > 知识库问答 >
问题:

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

丌官子安
2023-03-14

我正在尝试实现一个好的、可重用的片段,我很难选择设置交互回调的模式。我当然熟悉这些文档,但我对其中描述的方法有一些疑问。

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

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

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

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永远不会为null(只要片段还活着)
  • 如果我们在活动中使用多个片段,将会变得混乱

简单的侦听器模式。

public void setCallbacks(Callbacks callbacks) {
    mCallbacks = callbacks;
}
  • 可以在任何位置设置和替换回调
  • 调用回调方法之前需要进行nullchecks
  • 不会在片段重新创建时自动绑定(通过在活动的onAttachFragment中设置回调可以轻松修复)

我发现第一种方法不如第二种方法,因为它引入了不必要的限制,并在一定程度上违反了LoD,因为它要求回调方法由片段所连接的活动实现。它还使与嵌套片段的交互变得复杂,因为强制回调一直发送到活动,而不仅仅发送到父片段。同样,这是Android开发指南中建议的方法。我错过什么了吗?

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

共有1个答案

韩涵衍
2023-03-14

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

https://github.com/greenrobot/EventBus

 类似资料:
  • 我是Android开发新手,对OnAttach(上下文)方法有疑问。据我所知,您在扩展Fragment的类中重写了OnAttach方法,它基本上是将片段附加到作为参数传递的活动(上下文)。然而,在我在互联网上看到的许多示例代码中,人们用主要活动需要实现的方法创建了一个接口,并且在OnAttach方法中,他们键入上下文作为ex的接口) 我不明白的是这段代码: 将上下文类型化为为什么我们要将我们的主活

  • 我更新了我的应用程序,使用了最新的支持库(23.0.0版),我发现他们不推荐使用Fragment类的onAttach()函数。 而不是: 现在是: 由于我的app使用的是弃用前通过的活动,我认为一个可能的解决方案是: 点击这里查看我几周前打开的bug报告,以及谷歌的人给出的答案。

  • 好日子,我有三个活动与它们相应的片段,和。片断是静态片断,其他片断是动态的。 活动已实现片段的侦听器,该侦听器用于以横向方向加载片段或在单个窗格中移动到新屏幕。 我想要的是,当按下fragment中的某个按钮(该按钮调用fragment)时,我想要在横向方向上用fragment替换(fragment仍然存在),或者在单窗格模式下打开新屏幕。我在activity B方法中有以下简单代码: 我试图避免

  • 先生/女士,我想使用android JAVA将一个片段回调到另一个片段。我试图找到问题,但没有找到解决方案。若我使用接口,它会向活动发送回调响应,这是我不想要的。非常感谢。

  • 正如您在onCreate方法中看到的,我在“片段”列表的第0个片段上调用了getView。它返回null。我试着在代码中加入一个计时器,让它每秒运行一次,并检查视图是否为空。在计时器的第二个滴答声中,视图不为空。大体上 主要活动。JAVA 空白碎片。JAVA

  • 我正在尝试将Map放入一个片段中。我正在粘贴我正在使用的代码 XML 下面是我声明的片段名称 下面是我如何初始化地图 这个方法是在onCreateView上调用的 错误是 请帮助解决此问题。问题在下面部分 编辑1 将xml更改为 和 和初始化 但同样的错误是 这发生在排队的时候 为什么会发生这种情况?? 编辑2 对getmap已弃用。所以我试过了 和 以及回调。。 和setUpMap方法 错误显示