Fragmen Android: Kapan harus menggunakan sembunyikan / tampilkan atau tambahkan / hapus / ganti?

117

Misalkan saya ingin mengganti fragmen saat ini di beberapa tampilan kontainer dengan yang lain. Apakah lebih baik menggunakan ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... atau yang berikut ini, dengan show and hide?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

Apakah salah satu cara melakukan ini lebih efisien? Tidak dapat menemukan banyak informasi tentang kapan harus menggunakan metode ini, atau bagaimana pengaruhnya terhadap siklus proses fragmen yang terlibat. Terima kasih!

Robert Karl
sumber
jika saya pergi ke fragmen B dari fragmen A dan kemudian kembali ke fragmen A bagaimana saya bisa memastikan bahwa peristiwa siklus hidup seperti onCreateView tidak dipanggil pada fragmen A? apakah menemukan fragmen berdasarkan tag berfungsi?
blackHawk

Jawaban:

135

Anda harus mempertimbangkan apa yang akan Anda lakukan dengan fragmen untuk memutuskan jalan mana yang harus diikuti. Jika Anda menggunakan FragmentTransaction untuk menyembunyikan fragmen, maka fragmen tersebut masih bisa berada dalam status berjalan dari siklus prosesnya, tetapi UI-nya telah dilepaskan dari jendela sehingga tidak lagi terlihat. Jadi secara teknis Anda masih bisa berinteraksi dengan fragmen dan memasang kembali UI-nya nanti. Jika Anda mengganti fragmen, Anda sebenarnya menariknya keluar dari container dan itu akan melalui semua peristiwa pembongkaran dalam siklus proses (onPause, onStop, dll) dan jika karena alasan tertentu Anda memerlukan fragmen itu lagi, Anda harus melakukannya masukkan kembali ke dalam wadah dan biarkan berjalan melalui semua inisialisasi lagi.

Jika ada kemungkinan besar Anda akan membutuhkan fragmen itu lagi, maka sembunyikan saja karena ini adalah operasi yang lebih murah untuk menggambar ulang tata letaknya daripada menginisialisasi ulang sepenuhnya.

David C. Sainte-Claire
sumber
5
Untuk kebutuhan kita, menginisialisasi fragmen cukup mahal, jadi kita mungkin akan menggunakan hide()dan show()menghematnya! Terima kasih untuk ini!
Robert Karl
2
Hai, saat Anda mengucapkan lepas dari jendela, maksud Anda callback onDetach () akan dipanggil? Saya bereksperimen, sepertinya bukan itu masalahnya.
GingerJim
mungkin maksudnya "melepaskan"; sebuah fragmen juga dapat dilepas / dipasang kembali (sebagai tambahan untuk menambah / menghapus, menampilkan / menyembunyikan)
comeGetSome
1
@ Zainodis, saya punya masalah yang sama juga. Solusi saya adalah menyimpan status tersembunyi dari fragmen di onSaveInstanceState () - storedInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); lalu di onCreate () if (storedInstanceState! = null) dapatkan status tersembunyi kembali dan jika fragmen disembunyikan, sembunyikan dengan transaksi.
worawee.
1
@ worawee.s Halo dan terima kasih atas pembaruannya :)! Saya menyelesaikan masalah beberapa waktu yang lalu di pihak saya - saya tidak benar-benar perlu menyembunyikan / menampilkan dll. Jadi saya benar-benar menjatuhkannya dan sekarang saya menggunakan standar seperti menambah / mengganti atau aktivitas fragmen tunggal dalam satu panel (aliran detail utama pada dasarnya) . Bagi mereka yang masih menggunakan hide your solution akan sangat membantu - dan tidak memeriksa saveInstance! = Null adalah salah satu kesalahan yang saya buat sebelumnya.
AgentKnopf
5

Anda pada dasarnya menjawab diri sendiri. Jika Anda ingin mengganti (jadi fragment lama tidak lagi diperlukan) gunakan replace()jika Anda ingin menyembunyikannya sementara maka lakukan hide().

Marcin Orlowski
sumber
Pada dasarnya ganti tidak menghapus Semua. Saya tidak bisa menemukan hideAll :(
AlikElzin-kilaka
@ AlikElzin-kilaka Dalam aktivitas saya 3 fragmen di ketiga fragmen, saya mengambil data dari jaringan metode mana yang harus saya ikuti
Mansukh Ahir
0

Saya menggunakan metode hide / Show dalam aktivitas saya dengan 4 fragmen yang memecahkan solusi saya tetapi beberapa waktu secara acak ketika saya menampilkan dialog saya itu memberikan jendela pengecualian token buruk ketika saya menggunakan metode tambah dan ganti maka pengecualian token buruk tidak terjadi jadi saya pikir tampilkan / Metode sembunyikan tidak sempurna

Kawatra Dishant
sumber