Aktivitas:
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();
Kode dalam tampilan:
<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" />
Masalahnya adalah, konten tidak benar-benar diganti - konten tersebut diletakkan di atas (sehingga tumpang tindih).
Ketika saya mengklik kembali, fragmen pertama akan ditampilkan dengan benar (tanpa yang kedua), tetapi awalnya keduanya terlihat (saya hanya ingin yang terakhir terlihat).
Apa yang kulewatkan di sini?
containerViewId
(dalamreplace
metode).Jawaban:
Anda melakukan dua hal yang salah di sini:
Anda tidak dapat mengganti fragmen yang ditempatkan secara statis dalam
xml
file tata letak. Anda harus membuat wadah (mis. AFrameLayout
) dalam tata letak dan kemudian menambahkan fragmen secara terprogramFragmentTransaction
.FragmentTransaction.replace
mengharapkan id wadah yang berisi fragmen dan bukan id dari fragmen sebagai parameter pertama. Jadi, Anda harus meneruskan argumen pertama sebagai id container tempat Anda menambahkan fragmen pertama.Anda dapat merujuk ke tautan ini untuk lebih jelasnya.
sumber
FrameLayout
sebagai wadah lebih baik daripada menggunakanLinearLayout
.addTobackStack(..)
saat pertama kali bertransaksi. Ini akan menghindari penempatan wadah FrameLayout kosong ke tumpukan belakang. Anda masih dapat menavigasi kembali ke fragmen yang Anda tambahkan.Saya memiliki masalah yang sama, tetapi masalah saya adalah saya menggunakan dua manajer Fragmen yang berbeda: Satu dari
getSupportFragmentManager()
dan satu darigetFragmentManager()
. Jika saya menambahkan satu fragmen denganSupportFragmentManager
dan kemudian mencoba mengganti fragmen denganFragmentManager
, fragmen hanya akan ditambahkan di atas. Saya perlu mengubah kodenya sehingga hal yang samaFragmentManager
akan digunakan dan mengatasi masalah tersebut.sumber
Situs pengembang android menyarankan penggunaan a
FrameLayout
untuk memuat fragmen secara dinamis pada waktu proses. Anda telah membuat kode keras fragmen di file xml Anda. Jadi itu tidak dapat dihapus pada saat run-time seperti yang disebutkan di tautan ini:http://developer.android.com/training/basics/fragments/creating.html
tautan ini menunjukkan cara menambahkan fragmen melalui program Anda:
http://developer.android.com/training/basics/fragments/fragment-ui.html
sumber
Saya memiliki masalah yang sama dan melihat semua jawabannya, tetapi tidak ada yang mengandung kesalahan saya! Sebelum mencoba mengganti fragmen saat ini, saya menunjukkan fragmen default di xml aktivitas container seperti ini:
setelah itu, meskipun saya melewati
FrameLayout
kefragmentTransaction.replace()
tetapi saya memiliki masalah yang sebenarnya. itu menunjukkan fragmen kedua di atas yang sebelumnya.Masalah diperbaiki dengan menghapus fragmen dari xml dan menampilkannya secara terprogram dalam
onCreate()
metode aktivitas penampung untuk pratinjau default pada awal program seperti ini:dan aktivitas penampung xml:
sumber
Anda dapat menghapus backStack sebelum mengganti fragmen:
sumber
Tambahkan
android:background="?android:windowBackground">
ke wadah tempat fragmen Anda berada. Dalam kasus saya, saya menambahkanFrameLayout
, yang seharusnya membantu.sumber
Gunakan wadah daripada menggunakan fragmen
Sekarang di MainActivity
Harap diperhatikan bahwa kelas fragmen Anda harus mengimpor 'android.app.Fragment'. Pastikan, Anda menggunakan "support.v4" atau implementasi "asli" dan tidak mencampurnya. Saya mendapatkan masalah ini karena saya telah mencampurnya.
sumber
Saya setuju dengan jawaban Sapan Diwakar. Tetapi saya telah menemukan solusi tentang cara melakukan ini.
Pertama, dalam aktivitas Anda (misalnya
activity_main
), di mana Anda memiliki semua tata letak, Tambahkan aFrameLayout
. Tinggi dan lebarnya seharusnyamatch parent
. Juga, berikanid
.Sekarang, di fragmen Anda yang akan menggantikan layout saat ini, panggil
onPause()
danonResume()
. Inisialisasi semua wadah bagian dalamView
. Dan aturvisibility
keGONE
dalamonResume()
dan keVISIBLE
dalamonPause()
.CATATAN : Bukan
FrameLayout
yang Anda ganti dengan fragmen ini.Misalkan Anda memiliki
ViewPager
,TabLayout
,ImageView
dan kebiasaan<fragment>
diactivity_main.xml
. Tambahkan,FrameLayout
seperti yang disebutkan di atas.Dalam
abcFragment.java
, dionClick()
fungsi, tambahkanaddToBackstack(null)
ditransaction
.Kode contoh:
di xyzFragment, yang akan menggantikan abcFragment (dan semua yang ditampilkan di activity_main.xml), lakukan ini
Selamat membuat kode!
sumber
Anda dapat menggunakan metode setTransition dari FragmentTransaction untuk memperbaiki masalah yang tumpang tindih.
sumber
Dalam Oncreate ()
sekarang ini akan selalu menjadi fragmen default Anda ... jika Anda menambahkan fragmen dalam layout xml, itu akan selalu tumpang tindih, jadi setel konten awal dengan fragmen pada waktu proses
sumber
saya memiliki masalah yang sama setelah menggunakan masalah ini diselesaikan
Ambil tata letak bingkai di mana Anda mengganti fragmen Anda
dan kode untuk penggantian
jika Anda ingin seluruh contoh saya akan mengirimkan Anda komentar saya ......
sumber
Saya juga mengalami masalah yang sama, tetapi itu karena saya tidak mengubah warna latar belakang fragmen yang saya coba tambahkan ke framelayout saya.
Coba lakukan ini, dengan
layout_height
danlayout_width
setel kematch_parent
sumber
Saya pernah mengalami masalah ini dan mengetahui bahwa itu karena saya tidak sengaja menghapus
android:background
atribut yang hilang pada kode xml Anda. Saya percaya ini berfungsi seperti ketika Anda mengecat dinding,android:background
adalah warna dinding itu dan tampilan lain ditempatkan di atas warna dasar itu. Ketika Anda tidak mengecat dinding sebelum memposisikan pandangan Anda, pandangan Anda akan berada di atas apa yang sudah ada di dinding itu, dalam kasus Anda, fragmen Anda yang lain. Tidak tahu apakah itu akan membantu Anda, semoga berhasil.sumber
Saya telah mencoba di atas semua kasus dan mencoba memperbaiki masalah tetapi masih belum mendapat solusi. Saya tidak tahu mengapa itu tidak berhasil untuk saya. Saya setuju dengan jawaban di atas karena banyak yang setuju.
Saya hanya menyampaikan jawabannya dan di bawah ini adalah cara yang berhasil untuk saya.
Saya berharap seseorang akan mendapatkan bantuan.
sumber
Terima kasih untuk Sapan Diwakar dan lainnya. Jawaban ini membantu saya. Saya hanya membuat RelativeLayout tanpa fragmen di dalamnya, menggunakan RelativeLayout sebagai tampilan induk atau grup, menentukan tampilan grup dalam transaksi untuk diganti, dan berhasil.
Kode:
XML:
sumber
Periksa ID tata letak bingkai Anda dan ganti seperti di bawah ini
sumber