Saya menggunakan metode berikut untuk beralih di antara Fragmen (di NavigationDrawer saya) dengan menampilkan / menyembunyikannya.
protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if ( lastTag != null && !lastTag.equals("")) {
Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
if ( lastFragment != null ) {
transaction.hide( lastFragment );
}
}
if ( fragment.isAdded() ) {
transaction.show( fragment );
}
else {
transaction.add( container, fragment, tag );
}
if ( addToBackStack ) {
transaction.addToBackStack( tag );
}
transaction.commit();
// set the active tag
activeFragTag = tag;
}
Yang tidak saya jelaskan adalah metode siklus hidup Fragmen mana yang dipanggil saat saya menampilkan atau menyembunyikannya? (karena tidak ada metode seperti onShow () atau onHide () saya tidak yakin apa yang harus digunakan). Saya ingin melakukan tindakan tertentu setelah menampilkan dan menyembunyikan Fragmen tertentu.
android
android-fragments
lifecycle
fragmenttransaction
Philipp Jahoda
sumber
sumber
onCreate()
, diikuti olehonCreateDialog()
, diikuti olehonCreateView()
Jawaban:
Mirip dengan daur hidup aktivitas, Android memanggil onStart () ketika fragmen menjadi terlihat.
onStop()
biasanya dipanggil saat fragmen tidak terlihat, tetapi bisa juga dipanggil nanti.Bergantung pada tata letak Anda, Android bisa memanggil
onStart()
meskipun Fragmen Anda belum terlihat, tetapi itu milik penampung induk yang terlihat. Misalnya, ini berlakuandroid.support.v4.view.ViewPager
yang mengharuskan Anda untuk menggantiFragment.setUserVisibleHint()
metode. Bagaimanapun, jika Anda perlu mendaftarkan / membatalkan pendaftaran BroadcastReceivers atau pendengar lainnya, Anda dapat menggunakanonStart()
danonStop()
metode dengan aman karena metode tersebut akan dipanggil selalu.Catatan: Beberapa wadah fragmen dapat membuat fragmen tak terlihat dimulai. Untuk menangani situasi ini, Anda dapat mengganti
Fragment.onHiddenChanged(boolean hidden)
. Menurut dokumentasi , fragmen harus dimulai dan terlihat (tidak disembunyikan) , agar dapat dilihat oleh pengguna.Pembaruan: Jika Anda menggunakan,
android.support.v4.widget.DrawerLayout
maka fragmen di bawah laci tetap dimulai dan terlihat bahkan saat laci terbuka. Dalam hal ini Anda perlu menggunakanDrawerLayout.setDrawerListener()
dan mendengarkanonDrawerClosed()
sertaonDrawerOpened()
callback.sumber
onStop
danonPause
tidak dipanggil saat fragmen tidak terlihat menggunakan transaksi. Namun demikianonHiddenChanged
disebut sebagai jawaban s1riusSaya @Override metode ini dan menyelesaikan masalah saya:
sumber
setUserVisibleHint
seperti yang ditunjukkan dalam stackoverflow.com/a/18375436/1815624 bekerjatentu saja Anda dapat @Override metode berikut untuk melakukannya:
sumber
getUserVisibleHint()
Fragmen dalam tampilan pager berbeda dengan wadah fragmen biasa.
Coba kode ini:
sumber
Coba kode ini:
sumber
Anda bisa menggunakan 'onCreateView' (atau 'onActivityCreated') dan 'onHiddenChanged'. Gunakan 'onCreateView' untuk pertunjukan pertama dan gunakan 'onHiddenChanged' untuk nanti. 'setMenuVisibility' tidak dipanggil di kontrol transaksi.
sumber
Coba saja ini di setUserVisibleHint () Anda
Dan buat kode ini di onCreateView () :
sumber
isVisibleToUser && getView() != null
bekerja sempurna untuk saya!// pertama-tama Anda membuat antarmuka
// Setelah itu antarmuka ini diimplementasikan di dalam Fragmen seperti itu
// Sekarang masuklah Aktivitas Anda lalu buat objek antarmuka dan panggil di dalamnya saat addOnViewpagerListener
sumber
setUserVisibleHint
menelepon sebelumnyaonCreateView
. dan Anda tidak dapat memperbarui Tampilan apa pun di dalam setUserVisibleHint yang saya gunakanuntuk visibilitas dan onHiddenChanged () tidak memanggil untuk pertama kalinya . itu memanggil ketika status tersembunyi berubah. karena a
fragment is visible by default
. Untuk mencapai metode ini untuk pertama kalinya Anda harus memanggilmFragmentTransaction.hide(oldFragment)
maka itu akan berhasilCatatan
jika Anda ingin menggunakan petunjuk setUserVisible dan memperbarui Tampilan Gunakan metode ini
sumber
Tentu saja Anda bisa menimpanya
setUserVisibleHint
atausetMenuVisibility
tetapi jika Anda perlu mengaksesContext
atauActivity
, mereka akan menjadi nol di sana! Ada metode lainonStart
yang selalu memiliki konteks yang tersedia, tetapi itu hanya akan dipanggil satu kali setelah pembuatan fragmen dan jika Anda mulai berpindah antar fragmen dalam pager, Anda akan melihat bahwa itu tidak akan dipanggil dalam tampilan kedua dan setelahnya .Jadi ... apa yang harus dilakukan sekarang?
Solusinya cukup mudah, gunakan
onStart
untuk kunjungan pertama dansetMenuVisibility
selanjutnya. Kode Anda mungkin akan terlihat seperti di bawah ini:Kelas fragmen:
Cara ini
Context
akan selalu tersedia untukdoSth()
metode.sumber
Hanya ini yang berhasil untuk saya !! dan
setUserVisibleHint(...)
sekarang tidak digunakan lagi (saya melampirkan dokumen di bagian akhir), yang berarti beberapa jawaban lain tidak digunakan lagi ;-)Diuji dan bekerja dengan
NaviagationDrawer
baik,isMenuVisible()
akan selalu ada kembalitrue
(danonResume()
tampaknya cukup, tetapi kami ingin mendukungViewPager
juga).sumber