片段中没有的事情?

时间:2014-02-13 21:45:47

标签: android android-fragments

在谷歌的developer documentation片段中,他们提到了以下内容:

  

为了重用Fragment UI组件,您应该将每个组件构建为一个完全独立的模块化组件,以定义自己的布局和行为。一旦定义了这些可重用的片段,就可以将它们与Activity相关联,并将它们与应用程序逻辑相连接,以实现整个复合UI。

听起来真的很棒。然而,他们没有比以下更详细:

  

所有片段到片段的通信都是通过关联的Activity完成的。两个碎片永远不应该直接沟通。

我有什么东西可以避免在我的片段中使用/调用/做吗?

我认为使用Singleton会通过引入外部依赖/期望来破坏可重用性?

可以从Log.*内拨打SharedPreferencesToastAlertDialogFragment,还是应该避免这样做?

是否可以致电getActionBar()或假设托管Activity确实有ActionBar是愚蠢的?

如果Fragment需要向用户输出内容,无论是错误还是其他什么,它应该自己决定如何输出(Log,Toast,AlertDialog等),还是应该发送字符串回调并让托管活动决定它应该如何/应该做什么?

需要在ListFragment中填充要呈现给用户的数据。它应该自己获取数据(通过AsyncTask内部类中的网络请求),还是应该请求托管Activity为其获取数据?

1 个答案:

答案 0 :(得分:1)

这是一个非常好的问题。但是,正如您在问题中提到的那样,官方文档仅指定不会让片段直接相互通信。

现在,根据您的实现,您可能希望通过相关活动的回调执行复杂的方法和功能。特别是如果它是更多片段共有的功能。

至于简单的东西,比如调用Log。*,SharedPreferences,Toast和AlertDialog,我发现如果你在片段中完成它,它会非常好用。你不希望你的班级之间有很高的耦合。

此外,片段应该能够获取数据并向用户输出内容,但同样,它很大程度上取决于您的实现以及您正在处理的复杂程度。

我建议以身作则。特别是来自官方Android文档的表格样本。他们应该做对了:)

修改

确保在导航片段时始终使用回调。就像从片段中选择一个列表项并希望在另一个中看到详细信息一样。

以下代码来自http://developer.android.com/training/basics/fragments/index.html

的官方文档
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception.
    try {
        mCallback = (OnHeadlineSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

碎片也可以直接在它们之间进行通信,但上述解决方案更优雅,易于维护。