Saya memiliki beberapa fragmen di dalam suatu aktivitas. Pada sebuah tombol klik saya memulai sebuah fragmen baru, menambahkannya ke backstack. Saya secara alami mengharapkan onPause()
metode Fragmen saat ini dan onResume()
Fragmen baru untuk dipanggil. Yah itu tidak terjadi.
LoginFragment.java
public class LoginFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.login_fragment, container, false);
final FragmentManager mFragmentmanager = getFragmentManager();
Button btnHome = (Button)view.findViewById(R.id.home_btn);
btnHome.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
HomeFragment fragment = new HomeFragment();
FragmentTransaction ft2 = mFragmentmanager.beginTransaction();
ft2.setCustomAnimations(R.anim.slide_right, R.anim.slide_out_left
, R.anim.slide_left, R.anim.slide_out_right);
ft2.replace(R.id.middle_fragment, fragment);
ft2.addToBackStack("");
ft2.commit();
}
});
}
@Override
public void onResume() {
Log.e("DEBUG", "onResume of LoginFragment");
super.onResume();
}
@Override
public void onPause() {
Log.e("DEBUG", "OnPause of loginFragment");
super.onPause();
}
}
HomeFragment.java
public class HomeFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.login_fragment, container, false);
}
@Override
public void onResume() {
Log.e("DEBUG", "onResume of HomeFragment");
super.onResume();
}
@Override
public void onPause() {
Log.e("DEBUG", "OnPause of HomeFragment");
super.onPause();
}
}
Apa yang saya harapkan, adalah,
- Ketika diklik, LoginFragment akan diganti dengan
HomeFragment ,
onPause()
dari LoginFragment , danonResume()
dari HomeFragment dipanggil - Ketika kembali ditekan, HomeFragment adalah poped keluar dan LoginFragment terlihat, dan
onPause()
dari HomeFragment danonResume()
dari LoginFragment dipanggil.
Apa yang saya dapatkan adalah,
- Ketika tombol diklik, HomeFragment dengan benar mengganti LoginFragment , onResume () dari HomeFragment dipanggil, tetapi onPause () dari LoginFragment tidak pernah dipanggil.
- Saat ditekan kembali, HomeFragment muncul dengan benar untuk menampilkan LoginFragment , onPause () dari HomeFragment dipanggil, tetapi onResume () dari LoginFragment tidak pernah dipanggil.
Apakah ini perilaku normal? Mengapa onResume()
dari LoginFragment tidak mendapatkan disebut ketika saya menekan tombol kembali.
android
android-fragments
onresume
back-stack
Krishnabhadra
sumber
sumber
Jawaban:
Fragmen
onResume()
atauonPause()
akan dipanggil hanya ketika KegiatanonResume()
atauonPause()
dipanggil. Mereka sangat erat denganActivity
.Membaca Menangani Siklus Hidup Bagian dari artikel ini .
sumber
onPause()
dipanggil setelahonSaveInstanceState()
daripada sebelumnya. Ini dapat direproduksi jika Anda ke anak yang berbeda di sayaFragmentStatePagerAdapter
(katakanlah Anda pindah dari anak 0 ke anak 2, perhatikan untuk diri sendiri, ini terjadi karena anak 0 dihancurkan ketika anak 2 dibuka )ft2.replace()
,FragmentTransaction.remove()
metode dipanggil danLoginfragment
akan dihapus. Lihat ini . JadionStop()
dariLoginFragment
akan disebut bukanonPause()
. (Karena fragmen baru sepenuhnya menggantikan yang lama).ft2.addtobackstack()
, keadaanLoginfragment
akan disimpan sebagai bundel dan ketika Anda mengklik tombol kembali dariHomeFragment
,onViewStateRestored()
akan disebut diikuti olehonStart()
dariLoginFragment
. Jadi akhirnyaonResume()
tidak akan dipanggil.sumber
onViewStateRestored
dipanggil jika Anda memilikisetRetainInstance(true)
Inilah jawaban Gor versi saya yang lebih kuat (menggunakan fragmen.size () tidak dapat diandalkan karena ukuran tidak dikurangi setelah fragmen muncul)
Dan metode 'getCurrentTopFragment':
sumber
Jika Anda benar-benar ingin mengganti fragmen di dalam fragmen lain, Anda harus menggunakan Nested Fragmen .
Dalam kode Anda, Anda harus mengganti
dengan
sumber
tapi hati-hati jika lebih dari satu fragmen terlihat
sumber
ViewPager
dengan fragmen akan merujuk pada fragmennya)Saya memiliki kode yang sangat mirip dengan Anda dan jika berfungsi onPause () dan onResume (). Saat mengubah fragmen, fungsi-fungsi ini diaktifkan masing-masing.
Kode dalam fragmen:
Log ketika perubahan fragmen:
Fragmen onCreateView:
Tindakan saat saya membalas pulsa (dalam aktivitas tempat saya memuat fragmen):
sumber
Apa yang saya lakukan dalam fragmen anak:
Dan kemudian menimpa onResume di ParentFragment
sumber
Anda tidak dapat menambahkan fragmen ke fragmen. Ini perlu terjadi di FragmentActivity. Saya berasumsi Anda sedang membuat LoginFragment di FragmentActivity, jadi untuk membuatnya bekerja, Anda perlu menambahkan HomeFragment melalui FragmentActivity ketika login ditutup.
Poin umum adalah bahwa Anda memerlukan kelas FragmentActivity dari mana Anda menambahkan setiap Fragment ke FragmentManager. Tidak mungkin melakukan ini di dalam kelas Fragmen.
sumber
Jika Anda menambahkan fragmen dalam XML, Anda tidak dapat menukarnya secara dinamis. Apa yang terjadi adalah mereka terlalu berlebihan, sehingga peristiwa-peristiwa tidak terjadi seperti yang diharapkan. Masalahnya didokumentasikan dalam pertanyaan ini. Ganti FragmenManager membuat overlay
Ubah middle_fragment menjadi FrameLayout, dan muat seperti di bawah ini dan acara Anda akan diaktifkan.
sumber
Anda dapat mencoba ini,
Langkah1: Ganti metode yang Dipilih pada aktivitas Anda
Langkah 2: Menggunakan metode statis lakukan apa yang Anda inginkan dalam fragmen Anda,
sumber
Saya gunakan dalam aktivitas saya - KOTLIN
sumber
Sebuah fragmen harus selalu tertanam dalam suatu aktivitas dan siklus hidup fragmen secara langsung dipengaruhi oleh siklus hidup aktivitas host. Misalnya, ketika aktivitas dijeda, begitu juga semua fragmen di dalamnya, dan ketika aktivitas dihancurkan, begitu juga semua fragmen
sumber
onPause()
Metode bekerja di kelas aktivitas yang dapat Anda gunakan:untuk tujuan yang sama ..
sumber
Ikuti langkah-langkah di bawah ini, dan Anda akan mendapatkan jawaban yang dibutuhkan
1- Untuk kedua fragmen, buat induk abstrak baru.
2- Tambahkan metode abstrak kustom yang harus diimplementasikan oleh keduanya.
3- Sebut saja dari instance saat ini sebelum mengganti dengan yang kedua.
sumber
Berdasarkan jawaban @Gor saya menulis serupa di Kotlin. Tempatkan kode ini dalam
onCreate()
suatu kegiatan. Ini berfungsi untuk satu fragmen yang terlihat. Jika Anda memilikiViewPager
dengan fragmen, itu akan memanggilViewPager
fragmen, bukan yang sebelumnya.Setelah membaca https://medium.com/@elye.project/puzzle-fragment-stack-pop-cause-issue-on-toolbar-8b947c5c07c6 Saya mengerti bahwa akan lebih baik dalam banyak situasi untuk melampirkan fragmen baru dengan
replace
, bukanadd
. Jadi kebutuhanonResume
dalam beberapa kasus akan hilang.sumber
Panggilan
ft.replace
harus memicu onPause (dari fragmen yang diganti) dan onResume (dari fragmen yang diganti).Saya perhatikan bahwa kode Anda mengembang
login_fragment
pada fragmen rumah, dan juga tidak mengembalikan tampilan di onCreateView. Jika ini salah ketik, dapatkah Anda menunjukkan bagaimana fragmen-fragmen ini dipanggil dari dalam aktivitas Anda?sumber
Meskipun dengan kode yang berbeda, saya mengalami masalah yang sama dengan OP, karena saya awalnya menggunakan
dari pada
Dengan "ganti" fragmen pertama akan diciptakan kembali ketika Anda kembali dari fragmen kedua dan karenanya onResume () juga disebut.
sumber
Saat membuat transaksi fragmen, pastikan untuk menambahkan kode berikut.
Pastikan juga, untuk melakukan transaksi setelah menambahkannya ke backstack
sumber