在谷歌的developer documentation片段中,他们提到了以下内容:
为了重用Fragment UI组件,您应该将每个组件构建为一个完全独立的模块化组件,以定义自己的布局和行为。一旦定义了这些可重用的片段,就可以将它们与Activity相关联,并将它们与应用程序逻辑相连接,以实现整个复合UI。
听起来真的很棒。然而,他们没有比以下更详细:
所有片段到片段的通信都是通过关联的Activity完成的。两个碎片永远不应该直接沟通。
我有什么东西可以避免在我的片段中使用/调用/做吗?
我认为使用Singleton会通过引入外部依赖/期望来破坏可重用性?
可以从Log.*
内拨打SharedPreferences
,Toast
,AlertDialog
和Fragment
,还是应该避免这样做?
是否可以致电getActionBar()
或假设托管Activity
确实有ActionBar
是愚蠢的?
如果Fragment
需要向用户输出内容,无论是错误还是其他什么,它应该自己决定如何输出(Log,Toast,AlertDialog等),还是应该发送字符串回调并让托管活动决定它应该如何/应该做什么?
需要在ListFragment
中填充要呈现给用户的数据。它应该自己获取数据(通过AsyncTask
内部类中的网络请求),还是应该请求托管Activity
为其获取数据?
答案 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");
}
}
碎片也可以直接在它们之间进行通信,但上述解决方案更优雅,易于维护。