Android文档建议为了从Activity到托管的Fragment进行通信,Fragment可以定义一个回调接口,并要求宿主Activity实现它。基本模式涉及在Fragment中实现
onAttach
,并将Activity强制转换为回调接口。请参见http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity。以下是一个示例,演示如何为Fragment提供一些初始化数据以及监听导航回调。
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());
}
}
...
}
将此与在宿主 Activity 中使用 onAttachFragment
来显式初始化 fragment 进行比较:
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
是否存在缺点?