Aktivität:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment1 fragment = new Fragment1();
Fragment2 fragment2 = new Fragment2();
transaction.replace(R.id.Fragment1, fragment);
transaction.addToBackStack(null);
transaction.commit();
FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
transaction2.replace(R.id.Fragment1, fragment2);
transaction2.addToBackStack(null);
transaction2.commit();
Code in der Ansicht:
<fragment
android:id="@+id/Fragment1"
android:name="com.landa.fragment.Fragment1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_below="@+id/include1" />
Das Problem ist, dass der Inhalt nicht wirklich ersetzt wird - er wird oben platziert (so dass er sich überlappt).
Wenn ich zurückklicke, wird das erste Fragment richtig angezeigt (ohne das zweite), aber anfangs sind beide sichtbar (ich möchte, dass nur das letzte sichtbar ist).
Was fehlt mir hier?
android
android-fragments
Werkzeug
quelle
quelle
containerViewId
(in derreplace
Methode) übergeben.Antworten:
Sie machen hier zwei Dinge falsch:
Sie können ein Fragment nicht ersetzen, das statisch in einer
xml
Layoutdatei platziert ist. Sie sollten einen Container (z. B. aFrameLayout
) im Layout erstellen und das Fragment dann programmgesteuert mit hinzufügenFragmentTransaction
.FragmentTransaction.replace
erwartet die ID des Containers, der das Fragment enthält, und nicht die ID des Fragments als ersten Parameter. Sie sollten also das erste Argument als ID des Containers übergeben, dem Sie das erste Fragment hinzugefügt haben.Weitere Informationen finden Sie unter diesem Link .
quelle
FrameLayout
als Container ist besser als die VerwendungLinearLayout
.addTobackStack(..)
wenn Sie Ihre Transaktion zum ersten Mal ausführen . Dadurch wird vermieden, dass der leere FrameLayout-Container auf den hinteren Stapel gelegt wird. Sie können weiterhin zu dem Fragment navigieren, das Sie hinzugefügt haben.Ich hatte ein ähnliches Problem, aber mein Problem war, dass ich zwei verschiedene Fragmentmanager verwendete: einen von
getSupportFragmentManager()
und einen vongetFragmentManager()
. Wenn ich ein Fragment mit dem hinzufügenSupportFragmentManager
und dann versuchen würde, das Fragment durch das zu ersetzenFragmentManager
, würde das Fragment nur oben hinzugefügt. Ich musste den Code ändern, damit derselbeFragmentManager
verwendet wurde und das Problem behoben war.quelle
Die Android-Entwickler-Site schlägt die Verwendung von a vor
FrameLayout
, um Fragmente zur Laufzeit dynamisch zu laden. Sie haben das Fragment in Ihrer XML-Datei fest codiert. Es kann also nicht zur Laufzeit entfernt werden, wie in diesem Link erwähnt:http://developer.android.com/training/basics/fragments/creating.html
Dieser Link zeigt, wie Sie Fragmente über Ihr Programm hinzufügen:
http://developer.android.com/training/basics/fragments/fragment-ui.html
quelle
Ich hatte das gleiche Problem und sah alle Antworten, aber keine enthielt meinen Fehler! Bevor ich versuchte, das aktuelle Fragment zu ersetzen, zeigte ich das Standardfragment in der XML-Datei der Containeraktivität wie folgt an:
danach habe ich zwar das
FrameLayout
an das weitergegebenfragmentTransaction.replace()
aber ich hatte das genaue problem. es zeigte das zweite Fragment über dem vorherigen.Das Problem wurde behoben, indem das Fragment aus der XML entfernt und programmgesteuert in der
onCreate()
Methode der Containeraktivität für die Standardvorschau beim Start des Programms wie folgt angezeigt wurde:und die Containeraktivität xml:
quelle
Sie können backStack löschen, bevor Sie Fragmente ersetzen:
quelle
Fügen Sie
android:background="?android:windowBackground">
dem Container hinzu, in dem sich Ihr Fragment befindet. In meinem Fall habe ich ein hinzugefügtFrameLayout
, das sollte helfen.quelle
Verwenden Sie einen Container anstelle eines Fragments
Jetzt in MainActivity
Bitte beachten Sie, dass Ihre Fragmentklasse 'android.app.Fragment' importieren sollte. Stellen Sie sicher, dass Sie "support.v4" oder die "ursprünglichen" Implementierungen verwenden und diese nicht mischen. Ich bekam dieses Problem, weil ich sie gemischt hatte.
quelle
Ich stimme der Antwort von Sapan Diwakar zu. Aber ich habe eine Problemumgehung gefunden, wie das geht.
activity_main
Fügen Sie in Ihrer Aktivität (z. B. ), in der Sie alle Layouts haben, zunächst a hinzuFrameLayout
. Es sollte Höhe und Breite seinmatch parent
. Geben Sie es auch einid
.Rufen Sie nun in Ihrem Fragment, das das aktuelle Layout ersetzen soll,
onPause()
und aufonResume()
. Initialisieren Sie alle inneren Container inView
. Und setzenvisibility
sieGONE
einonResume()
undVISIBLE
einonPause()
.HINWEIS : Nicht das,
FrameLayout
was Sie durch dieses Fragment ersetzen.Angenommen , Sie haben
ViewPager
,TabLayout
,ImageView
und ein Brauch<fragment>
inactivity_main.xml
. Fügen Sie einFrameLayout
wie oben erwähnt hinzu.In
abcFragment.java
, inonClick()
Funktion, fügen SieaddToBackstack(null)
intransaction
.Beispielcode:
Führen Sie dies in xyzFragment aus, das abcFragment (und alles, was in activity_main.xml angezeigt wird) ersetzen wird
Viel Spaß beim Codieren!
quelle
Sie können die setTransition-Methode von FragmentTransaction verwenden, um überlappende Probleme zu beheben.
quelle
In Oncreate ()
Jetzt ist dies immer Ihr Standardfragment. Wenn Sie ein Fragment im XML-Layout hinzufügen, überlappt es sich immer. Legen Sie daher zur Laufzeit den anfänglichen Inhalt mit dem Fragment fest
quelle
Ich hatte das gleiche Problem, nachdem ich dieses Problem gelöst hatte
Nehmen Sie das Rahmenlayout, in dem Sie Ihr Fragment ersetzen
und Code für den Austausch
Wenn du ein ganzes Beispiel willst, sende ich dir einfach einen Kommentar ......
quelle
Ich hatte auch das gleiche Problem, aber es war, weil ich die Hintergrundfarbe des Fragments, das ich zu meinem Framelayout hinzufügen wollte, nicht geändert hatte.
Versuchen Sie dies mit
layout_height
undlayout_width
setzen Sie aufmatch_parent
quelle
Ich hatte einmal dieses Problem und fand heraus, dass es daran lag, dass ich versehentlich das
android:background
Attribut gelöscht hatte, das in Ihrem XML-Code fehlt. Ich glaube, es funktioniert so, als ob Sie eine Wand streichen. Esandroid:background
ist die Farbe, die die Wand haben wird, und die anderen Ansichten werden über dieser Grundfarbe platziert. Wenn Sie die Wand vor dem Positionieren Ihrer Ansichten nicht streichen, befinden sie sich auf dem, was sich bereits in dieser Wand befand, in Ihrem Fall auf Ihrem anderen Fragment. Ich weiß nicht, ob dir das helfen wird, viel Glück.quelle
Ich habe vor allem den Fall versucht und versucht, das Problem zu beheben, aber immer noch keine Lösung gefunden. Ich weiß nicht, warum es bei mir nicht funktioniert. Ich stimme den obigen Antworten zu, weil so viele damit einverstanden sind.
Ich erweitere nur die Antwort und unten ist die Art und Weise, wie es für mich funktioniert.
Ich hoffe jemand bekommt Hilfe.
quelle
Vielen Dank an Sapan Diwakar und andere. Diese Antwort hat mir geholfen. Ich habe einfach ein RelativeLayout ohne Fragment erstellt, das RelativeLayout als übergeordnete oder Gruppenansicht verwendet, diese Gruppenansicht in der zu ersetzenden Transaktion angegeben und es hat funktioniert.
Code:
XML:
quelle
Überprüfen Sie Ihre Rahmenlayout-ID und ersetzen Sie sie wie folgt
quelle