В документации на Android показано, что для связи с активностью с размещенным фрагментом фрагмент может определять интерфейс обратного вызова и требовать, чтобы его активность выполняла его. Основной шаблон включает в себя реализацию 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
из активности хоста?