Android 文档建议从一个 Activity 到一个托管的 Fragment 进行通信,该 Fragment 可以定义一个回调接口并要求宿主 Activity 实现它。基本模式涉及onAttach
在您的片段中实现,并将活动转换为回调接口。请参阅http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity。
这是一个为片段提供一些初始化数据以及监听导航回调的示例。
public class HostActivity extends Activity implements FragmentHost {
@Override
UiModel getUiModel() {
return mUiModel;
}
@Override
FragmentNavListener getNavListener() {
return mNavListener;
}
...
}
public class HostedFragment extends Fragment {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof FragmentHost) {
FragmentHost host = (FragmentHost) activity;
setUiModel(host.getUiModel());
setNavListener(host.getFragmentNavListener());
}
}
...
}
将此与onAttachFragment
在主机活动中使用以显式初始化片段进行比较:
public class HostActivity extends Activity {
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment instanceof HostedFragment) {
HostedFragment hostedFragment = ((HostFragment) fragment);
hostedFragment.setUiModel(mUiModel);
hostedFragment.setNavListener(mNavListener);
}
}
...
}
对我来说,第一种模式似乎有一些缺点:
- 它使片段更难从不同的活动中使用,因为所有这些活动都必须实现所需的接口。我可以想象给定片段实例不需要由主机活动完全配置的情况,但所有潜在的主机活动都需要实现主机接口。
- 对于不熟悉正在使用的模式的人来说,这会使代码稍微难以理解。在 onFragmentAttached 中初始化片段似乎更容易理解,因为初始化代码位于创建片段的同一类中。
- 使用像 Robolectric 这样的库进行单元测试变得更加困难,因为在调用 onAttach 时,您现在必须实现 FragmentHost 而不仅仅是调用 onAttach(new Activity()。
对于那些从事过分散交流活动的人,您认为哪种模式更可取,为什么?onAttachFragment
从主机活动中使用有缺点吗?