In meinem main.xml
habe ich
<FrameLayout
android:id="@+id/frameTitle"
android:padding="5dp"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@drawable/title_bg">
<fragment
android:name="com.fragment.TitleFragment"
android:id="@+id/fragmentTag"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
Und ich setze ein Fragmentobjekt wie dieses
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");
// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Es werden verschiedene Arten von Fragmentobjekten ( FragmentType2,FragmentType3,...
) zu unterschiedlichen Zeiten festgelegt. Jetzt muss ich irgendwann herausfinden, welches Objekt gerade dort ist.
In kurzen brauche ich so etwas wie dies zu tun:
Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Ich habe folgendes versucht
TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
und
TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Aber beide Objekte (titleFragmentById und titleFragmentByTag) sindnull
Haben ich etwas verpasst?
Ich benutze Compatibility Package, r3
und entwickle für API level 7
.
findFragmentById()
und findFragmentByTag()
wird funktionieren, wenn wir Fragment mit fragmentTransaction.replace
oder gesetzt haben fragmentTransaction.add
, aber return null
wenn wir das Objekt auf xml gesetzt haben (wie das, was ich in meinem getan habe main.xml
). Ich glaube, ich vermisse etwas in meinen XML-Dateien.
quelle
Antworten:
Rufen Sie
findFragmentById()
anFragmentManager
und bestimmen Sie, welches Fragment sich in IhremR.id.frameTitle
Container befindet.quelle
fragmentTransaction.replac
e gesetzt haben oderfragmentTransaction.add
aber nicht bekommen, wenn wir es auf xml gesetzt haben. Siehe meine Bearbeitung 2findFragmentByTag
beiActionBar
Tabs null zurück . In meinerActivity
ErweiterungActionBarActivity
füge ich zuerst Tabs hinzuActionBar
und finde sie dann!executePendingTransactions()
aufFragmentManager
Aufruf nachcommit()
auf die Transaktion, obwohl ich nicht versucht haben. Oder Sie könnensetContentView()
eine Layoutdatei mit einem<fragment>
Tag verwenden. Beides geschieht synchron, sodass das Fragment innerhalb desonCreate()
Aufrufs selbst vorhanden ist, in dem SieexecutePendingTransaction()
oder verwendet habensetContentView()
. Andernfalls wird ein NormalerFragmentTransaction
asynchron verarbeitet und hat bis zumonCreate()
Ende der Zeit noch nicht einmal begonnen .Versuche dies,
Dies gibt dir das aktuelle Fragment, dann kannst du es mit der Fragmentklasse vergleichen und deine Sachen machen.
quelle
getSupportFragmentManager()
stattdessen verwenden und wird ohne dassupport
Teil nullIch denke, Sie können das Ereignis onAttachFragment verwenden, um herauszufinden , welches Fragment aktiv ist.
quelle
Ich denke du solltest tun:
Der Grund dafür ist, dass Sie das Tag "fragmentTag" auf das zuletzt hinzugefügte Fragment setzen (als Sie replace aufgerufen haben).
quelle
fragmentTransaction.replac
e gesetzt haben oderfragmentTransaction.add
aber nicht bekommen, wenn wir es auf xml gesetzt haben. Siehe meine Bearbeitung 2fragmentTag
das Tag für das aktuelle Fragment ist?Sie können die Liste der Fragmente abrufen und zum letzten schauen.
Aber manchmal (wenn Sie zurück navigieren) bleibt die Listengröße gleich, aber einige der letzten Elemente sind null. Also habe ich in der Liste bis zum letzten Nicht-Null-Fragment iteriert und es verwendet.
quelle
getFragments()
Methode nicht. Es ist mit gekennzeichnet@hide
und sollte nicht in der Unterstützungsbibliothek enthalten sein. Es sollte nicht als Teil der exportierten API betrachtet werden.getFragments()
, weil Sie sie ziemlich oft brauchen. Ich denke, es ist jetzt auch öffentlich verfügbar.Dies ist die einfachste Lösung und Arbeit für mich.
1.) Sie fügen Ihr Fragment hinzu
2.)
quelle
Es könnte spät sein, aber ich hoffe, es hilft jemand anderem, auch @CommonsWare hat die richtige Antwort gepostet.
quelle
Vielleicht ist der einfachste Weg:
Es hat bei mir funktioniert
quelle
Sie können ein Feld in Ihrer übergeordneten Aktivitätsklasse erstellen:
Und dann in jeder Fragmentklasse:
Ihr 'fr'-Feld ist das aktuelle Fragmentobjekt
Es funktioniert auch mit popBackStack ()
quelle
Ich weiß, dass es eine Weile her ist, aber ich werde dies hier tun, falls es jemandem hilft.
Die mit Abstand richtige Antwort ist (und die ausgewählte) die von CommonsWare. Ich hatte das gleiche Problem wie das folgende
gab immer wieder null zurück. Mein Fehler war wirklich albern in meiner XML-Datei:
Der Fehler war, dass ich android: tag STATT android: id hatte .
quelle
@ Hammer Antwort hat bei mir funktioniert, ich benutze, um eine schwebende Aktionstaste zu steuern
quelle
Wenn Sie von AbstractActivity aus erweitern, können Sie die Methode getFragments () verwenden:
quelle
Wenn Sie das Fragment in der XML-Ebene der Aktivität definieren,
Activity
stellen Sie sicher, dass SiesetContentView()
vor dem Aufruf aufrufenfindFragmentById()
.quelle
Wenn Sie den BackStack verwenden ... und NUR, wenn Sie den Backstack verwenden, versuchen Sie Folgendes:
quelle
Dadurch erhalten Sie den aktuellen Fragmentklassennamen ->
quelle
Führen Sie in der onStart-Methode eine Überprüfung durch (welches Fragment im Aktivitätscontainer).
Einige überprüfen:
quelle