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でフラグメントを初期化する方が簡単なようです。
- onAttach(new Activity()を呼び出すだけでなく、FragmentHostを実装する必要があるため、Robolectricなどのライブラリを使用した単体テストは難しくなります。
コミュニケーションを断片化する活動をしたことがある人にとって、どのパターンが好ましいと思いますか、そしてその理由は何ですか?onAttachFragment
ホストアクティビティから使用することには欠点がありますか?