Die folgende Lösung ist nicht perfekt, aber es funktioniert in gewissem Maße:
- Wenn Android SDK 17+ ist, dann funktioniert es gut
- unter SDK 17 für Fragmente auf Root-Ebene arbeitet (hinzugefügt direkt zur Aktivität), und funktioniert auch für Fragmente der Ebene 1 (hinzugefügt zu einem Fragment auf der Stammebene).
- für Fragmente der Ebene> = 2, dann wird immer ein Fragment der Root-Ebene zurückgegeben. Es bedeutet, dass es nicht möglich ist, das echte Elternteil eines Fragments zurückzugeben, dessen Level> = 2 ist, es wird immer seinen Vorgänger auf der Root-Ebene zurückgeben.
- Und leider bedeutet es, dass Sie Zugriff auf die Aktivitätsklasse haben müssen, also ist diese Lösung nicht wirklich generisch.
Hier ist die Lösung. Die MyActivity-Klasse ist unten angegeben.
public static Fragment getParentFragment(Fragment fragment) {
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN)
return fragment.getParentFragment();
MyActivity activity = (MyActivity)fragment.getActivity();
List<Fragment> fragmentList = activity.getActiveFragments();
if(fragmentList.contains(fragment)) {
return null;
}
for(Fragment fragmentLevel1 : fragmentList) {
if(fragmentLevel1.getFragmentManager() == fragment.getFragmentManager()) {
return fragmentLevel1;
}
}
//this is not supposed to happen, it might be better to throw an exception
return null;
}
Wo MyActivity basiert auf: Is there a way to get references for all currently active fragments in an Activity?
public class MyActivity {
List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>();
@Override
public void onAttachFragment (Fragment fragment) {
fragList.add(new WeakReference(fragment));
}
public List<Fragment> getActiveFragments() {
ArrayList<Fragment> ret = new ArrayList<Fragment>();
for(WeakReference<Fragment> ref : fragList) {
Fragment f = ref.get();
if(f != null) {
if(f.isVisible()) {
ret.add(f);
}
}
}
return ret;
}
}
gleiche Art und Weise wie das, was? Außerdem suche ich nach einer Methode, die immer funktioniert, es ist nicht für eine App, sondern für eine Bibliothek, die für alle Apps funktionieren sollte. – Snicolas
Wie die Antwort, mit der Sie verknüpft haben (mit getFragments()). Ich glaube nicht, dass es anders geht. – kcoppock
Es sieht so aus, als ob getFragments auf dem Support Fragment Manager veröffentlicht wurde, auch wenn Javadoc das nicht sagt. Und ja, die Verwendung von Reflektion ist für den nativen Fragmentmanager obligatorisch. – Snicolas