Die Android-Dokumentation schlägt vor, dass das Fragment, um von einer Aktivität zu einem gehosteten Fragment zu kommunizieren, eine Callback-Schnittstelle definieren kann und dass die Host-Aktivität es implementieren muss. Das Grundmuster beinhaltet die Implementierung von onAttach
in Ihrem Fragment und die Umwandlung der Aktivität in eine Callback-Schnittstelle. Siehe http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity.Ist es vorzuziehen, Activity.onAttachFragment oder Fragment.onAttach zu verwenden, um zwischen einer Aktivität und einem verschachtelten Fragment zu kommunizieren?
Hier ist ein Beispiel für die Bereitstellung eines Fragments einige Initialisierungsdaten sowie das Abhören eines Navigationsrückrufs.
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());
}
}
...
}
Vergleichen Sie dies onAttachFragment
in der Host-Aktivität zu verwenden ausdrücklich das Fragment zu initialisieren:
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);
}
}
...
}
Für mich ist es wie das erste Muster scheint hat einige Nachteile:
- Es macht das Fragment, das aus verschiedenen Aktivitäten schwieriger zu verwenden ist, seit , da alle diese Aktivitäten die erforderliche Schnittstelle implementieren müssen. Ich kann mir Fälle vorstellen, in denen eine bestimmte Fragment-Instanz nicht vollständig von der Host-Aktivität konfiguriert werden muss, aber alle möglichen Host-Aktivitäten die Host-Schnittstelle implementieren müssen.
- Es macht den Code etwas schwieriger für jemanden zu folgen, der nicht mit dem verwendeten Muster vertraut ist. Das Initialisieren des Fragments in onFragmentAttached scheint einfacher zu folgen, da der Initialisierungscode in der gleichen Klasse lebt, in der das Fragment erstellt wird.
- Unit-Tests eine Bibliothek wie Robolectric wird schwieriger, da beim Aufruf onAttach verwenden, müssen Sie jetzt FragmentHost implementieren, anstatt nur onAttach (neue Aktivitäten() aufrufen.
Für diejenigen unter Ihnen, die Aktivität getan haben Fragment Kommunikation, welche Muster finden Sie bevorzugt und warum? gibt es Nachteile onAttachFragment
von der Host-Aktivität zu verwenden?
Otto ist jetzt veraltet – Louis