Es scheint, dass viele Leute, die diese Frage sehen, nach einer Möglichkeit suchen, auf das Fragments
von FragmentPagerAdapter
/ erstellte zu verweisen FragmentStatePagerAdapter
. Ich möchte meine Lösung dafür anbieten, ohne mich auf das intern Geschaffene zu verlassentags
, die die anderen Antworten hier verwenden.
Als Bonus sollte diese Methode auch funktionieren FragmentStatePagerAdapter
. Weitere Informationen finden Sie in den nachstehenden Hinweisen.
Problem mit aktuellen Lösungen: Verlassen Sie sich auf internen Code
Viele der Lösungen, die ich für diese und ähnliche Fragen gesehen habe, basieren darauf, einen Verweis auf das Vorhandene zu erhalten Fragment
, FragmentManager.findFragmentByTag()
indem das intern erstellte Tag"android:switcher:" + viewId + ":" + id
aufgerufen und nachgeahmt wird : . Das Problem dabei ist, dass Sie sich auf internen Quellcode verlassen, der bekanntlich nicht für immer gleich bleibt. Die Android-Ingenieure bei Google könnten leicht entscheiden, die tag
Struktur zu ändern, die Ihren Code beschädigen würde, sodass Sie keinen Verweis auf den vorhandenen finden können Fragments
.
Alternative Lösung ohne interne tag
Hier ist ein einfaches Beispiel dafür, wie Sie einen Verweis auf das Fragments
zurückgegebene erhalten FragmentPagerAdapter
, der nicht vom internen abhängttags
Menge auf demFragments
. Der Schlüssel besteht darin instantiateItem()
, Referenzen dort zu überschreiben und zu speichern, anstatt in getItem()
.
public class SomeActivity extends Activity {
private FragmentA m1stFragment;
private FragmentB m2ndFragment;
private class CustomPagerAdapter extends FragmentPagerAdapter {
public CustomPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new FragmentA();
case 1:
return new FragmentB();
default:
return null;
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
switch (position) {
case 0:
m1stFragment = (FragmentA) createdFragment;
break;
case 1:
m2ndFragment = (FragmentB) createdFragment;
break;
}
return createdFragment;
}
}
public void someMethod() {
if (m1stFragment != null) {
}
if (m2ndFragment != null) {
}
}
}
oder wenn Sie arbeiten lieber mit tags
statt Klasse Membervariablen / Verweis auf die Fragments
Sie kann auch den greifen tags
Satz von FragmentPagerAdapter
auf die gleiche Weise: HINWEIS: dies gilt nicht , FragmentStatePagerAdapter
da es nicht gesetzt ist , tags
wenn seine Erstellung Fragments
.
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
switch (position) {
case 0:
String firstTag = createdFragment.getTag();
break;
case 1:
String secondTag = createdFragment.getTag();
break;
}
return createdFragment;
}
Beachten Sie, dass diese Methode NICHT auf der Nachahmung des internen tag
Satzes durch beruht FragmentPagerAdapter
und stattdessen geeignete APIs zum Abrufen verwendet. Auf diese Weise sind Sie auch dann sicher, wenn die tag
Änderungen in zukünftigen Versionen von vorgenommen SupportLibrary
werden.
Vergessen Sie nicht, dass das Design Activity
, an dem Fragments
Sie arbeiten möchten , je nach Design möglicherweise noch vorhanden ist oder nicht. Sie müssen dies also berücksichtigennull
Überprüfungen durchführen, bevor Sie Ihre Referenzen verwenden.
Wenn Sie stattdessen mit arbeiten FragmentStatePagerAdapter
, möchten Sie keine harten Verweise auf Ihre behalten, Fragments
da Sie möglicherweise viele davon haben und harte Verweise sie unnötigerweise im Speicher behalten würden. Speichern Sie stattdessen die Fragment
Referenzen in WeakReference
Variablen anstelle von Standardreferenzen. So was:
WeakReference<Fragment> m1stFragment = new WeakReference<Fragment>(createdFragment);
Fragment firstFragment = m1stFragment.get();
if (firstFragment != null) {
}