Bagaimana menerapkan onBackPressed() dalam Fragmen?
Apakah ada cara di mana kita dapat melaksanakan onBackPressed()
di Android Fragmen yang mirip dengan cara di mana kita melaksanakan di Android Aktivitas?
Sebagai Fragmen siklus hidup tidak memiliki onBackPressed()
. Apakah ada alternatif lain metode untuk lebih naik onBackPressed()
pada Android 3.0 fragmen?
418
45
Aku diselesaikan dengan cara ini menimpa
onBackPressed
dalam Kegiatan tersebut. SemuaFragmentTransaction
adalahaddToBackStack
sebelum melakukan:Aku hal terbaik solusi
SOLUSI JAVA
Membuat antarmuka yang sederhana :
Dan dalam Aktivitas anda
Akhirnya di Fragmen:
KOTLIN SOLUSI
1 - Membuat Antarmuka
2 - Mempersiapkan Aktivitas anda
3 - Melaksanakan target anda Fragmen
Menurut @Dipalu jawaban berikut adalah pseudocode bagaimana harus bekerja. Katakanlah bahwa aktivitas utama anda adalah yang disebut
BaseActivity
yang memiliki anak fragmen (seperti di SlidingMenu lib contoh). Berikut ini adalah langkah-langkahnya:Pertama kita perlu membuat interface dan kelas yang mengimplementasikan interface-nya untuk memiliki metode generik
OnBackPressedListener
antarmuka publik OnBackPressedListener { public void doBack(); }
OnBackPressedListener
public class BaseBackPressedListener mengimplementasikan OnBackPressedListener { private akhir FragmentActivity kegiatan;
publik BaseBackPressedListener(FragmentActivity kegiatan) { ini.kegiatan = kegiatan; }
@Override public void doBack() { kegiatan.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } }
BaseActivity
dan fragmenBaseActivity
dilindungi OnBackPressedListener onBackPressedListener;
BaseActivity
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) { ini.onBackPressedListener = onBackPressedListener; }
onBackPressed
melaksanakan sesuatu seperti itu@Override public void onBackPressed() { jika (onBackPressedListener != null) onBackPressedListener.doBack(); lain super.onBackPressed();
onCreateView
anda harus menambahkan pendengar kami@Override Pandangan publik onCreateView(LayoutInflater inflater, ViewGroup wadah, Bundle savedInstanceState) { kegiatan = getActivity();
((BaseActivity)kegiatan).setOnBackPressedListener(baru BaseBackPressedListener(aktivitas));
View = ... ; //hal-hal dengan melihat
kembali melihat; }
Voila, sekarang ketika anda klik kembali pada fragmen anda harus menangkap kustom anda pada metode kembali.
Ini bekerja untuk saya: https://stackoverflow.com/a/27145007/3934111
Jika anda ingin semacam fungsi yang anda akan perlu untuk menimpa pada aktivitas anda, dan kemudian menambahkan
YourBackPressed
antarmuka untuk semua fragmen, yang anda sebut di atas relevan fragmen setiap kali tombol kembali ditekan.Edit: I'd ingin menambahkan jawaban saya sebelumnya.
Jika saya lakukan hari ini, saya'a menggunakan broadcast, atau mungkin memerintahkan siaran jika saya harapkan panel lain untuk pemutakhiran serempak ke master/konten utama panel.
LocalBroadcastManager
dalam Mendukung Perpustakaan dapat membantu dengan ini, dan anda hanya mengirim broadcast dionBackPressed
dan berlangganan di fragmen yang peduli. Saya berpikir bahwa Pesan yang lebih dipisahkan pelaksanaan dan skala baik, sehingga akan saya resmi pelaksanaan rekomendasi sekarang. Hanya menggunakanNiat
's bertindak sebagai filter untuk pesan anda. mengirimkan anda yang baru dibuatACTION_BACK_PRESSED
, kirim dari aktivitas anda dan mendengarkan untuk itu dalam relevan fragmen.Tidak ada yang mudah untuk menerapkan dan tidak akan berfungsi secara optimal.
Fragmen memiliki metode panggilan onDetach yang akan melakukan pekerjaan.
INI AKAN MELAKUKAN PEKERJAAN.
Hanya menambahkan
addToBackStack
saat anda beralih di antara fragmen-fragmen seperti di bawah ini:jika anda menulis
addToBackStack(null)
, itu akan menangani hal ini dengan sendirinya tetapi jika anda memberi tag , anda harus menanganinya secara manual.karena pertanyaan ini dan beberapa jawaban yang lebih dari lima tahun, biarkan saya berbagi solusi saya. Ini adalah follow-up dan modernisasi untuk jawaban dari @oyenigun
UPDATE: Di bagian bawah artikel ini, saya menambahkan alternatif implementasi menggunakan abstrak Fragmen ekstensi yang tidak't melibatkan Aktivitas sama sekali, yang akan berguna bagi siapa saja dengan yang lebih kompleks fragmen hirarki yang melibatkan bersarang fragmen yang berbeda membutuhkan kembali perilaku.
Aku yang diperlukan untuk melaksanakan ini karena beberapa fragmen yang saya gunakan memiliki pandangan yang lebih kecil yang saya ingin memberhentikan dengan tombol kembali, seperti informasi kecil pemandangan yang pop up, dll, tapi ini bagus untuk siapa saja yang membutuhkan untuk mengganti perilaku tombol kembali di dalam fragmen-fragmen.
Pertama, mendefinisikan sebuah Antarmuka
Antarmuka ini, yang saya sebut
Didukung
(I'm ngotot untuk konvensi penamaan), memiliki satu metodeonBackPressed()
yang harus kembaliboolean
nilai. Kita perlu menegakkan nilai boolean karena kita akan perlu untuk mengetahui apakah tombol kembali tekan "diserap" kembali acara. Kembalibenar
berarti bahwa ia memiliki, dan tidak ada tindakan lebih lanjut diperlukan, jika tidak,false
mengatakan bahwa default kembali aksi masih berlangsung. Antarmuka ini harus itu's file sendiri (sebaiknya dalam paket terpisah bernamainterface
). Ingat, memisahkan kelas anda ke dalam paket adalah praktik yang baik.Kedua, menemukan beberapa fragmen
Saya dibuat sebuah metode yang mengembalikan terakhir
Fragmen
objek di belakang tumpukan. Saya menggunakan tag... jika anda menggunakan ID's, membuat perubahan yang diperlukan. Saya memiliki metode statis di kelas utilitas yang berhubungan dengan navigasi serikat, dll... tapi tentu saja, menempatkan di tempat yang paling cocok untuk anda. Untuk peneguhan, I've menempatkan saya di kelas yang disebutNavUtils
.Pastikan kembali tumpukan hitung lebih besar dari 0, jika tidak sebuah
ArrayOutOfBoundsException
bisa dilemparkan pada saat runtime. Jika isn't lebih besar dari 0, return null. Kami'll memeriksa nilai null nanti...Ketiga, Menerapkan dalam sebuah Fragmen
Menerapkan
Didukung
antarmuka di mana fragmen di mana anda perlu untuk mengganti tombol kembali perilaku. Tambahkan metode pelaksanaan.Di
onBackPressed()
override, menempatkan apapun logika yang anda butuhkan. Jika anda ingin tombol back to bukan pop back stack (perilaku default), kembali sejati, bahwa anda kembali acara yang telah diserap. Jika tidak, kembali palsu.Terakhir, dalam Aktivitas anda...
Menimpa
onBackPressed()
metode dan menambahkan logika ini:Kami mendapatkan fragmen saat ini di back stack, maka kita lakukan null memeriksa dan menentukan apakah itu mengimplementasikan kami
Didukung
antarmuka. Jika tidak, menentukan apakah acara tersebut diserap. Jika demikian, kita're dilakukan denganonBackPressed()
dan dapat kembali. Jika tidak, memperlakukannya sebagai normal kembali tekan dan call super metode.Pilihan kedua untuk tidak melibatkan Aktivitas
Pada saat ini, anda don't ingin Kegiatan untuk menangani ini semua, dan anda perlu untuk menangani langsung dalam fragmen. Tapi siapa bilang anda dapat't memiliki Fragmen dengan tekan kembali API? Hanya memperpanjang fragmen ke kelas baru.
Membuat sebuah kelas abstrak yang memanjang Fragmen dan mengimplementasikan
Melihat.OnKeyListner
antarmuka...Seperti yang anda lihat, setiap fragmen yang meluas
BackableFragment
secara otomatis akan menangkap kembali klik menggunakanMelihat.OnKeyListener
antarmuka. Hanya panggilan abstrakonBackButtonPressed()
metode dari dalam menerapkanng mengambang dan donkey()
menggunakan metode standar logika untuk melihat tekan tombol kembali. Jika anda perlu untuk mendaftar klik tombol selain tombol kembali, hanya pastikan untuk memanggilsuper
ketika meng-override metodeng mengambang dan donkey()
dalam fragmen anda, jika anda'll override perilaku dalam abstraksi.Mudah digunakan, hanya memperluas dan menerapkan:
Sejak
onBackButtonPressed()
metode di kelas super adalah abstrak, setelah anda memperpanjang anda harus menerapkanonBackButtonPressed()
. Kembalibatal
karena itu hanya perlu untuk melakukan suatu tindakan dalam fragmen kelas, dan tidak perlu relay penyerapan tekan kembali untuk Aktivitas. Pastikan anda melakukan panggilan AktivitasonBackPressed()
jika metode apapun yang anda're lakukan dengan tombol kembali doesn't membutuhkan penanganan, jika tidak, tombol kembali akan dinonaktifkan... dan anda don't ingin itu!Peringatan Seperti yang anda lihat, ini set kunci pendengar ke akar lihat dari fragmen, dan kami'll perlu fokus itu. Jika ada yang mengedit naskah-naskah yang terlibat (atau yang lain fokus-mencuri pandangan) dalam fragmen yang membentang di kelas ini, (atau bagian lain fragmen atau pandangan yang sama), anda'll perlu menangani secara terpisah. Ada's sebuah artikel yang baik pada memperpanjang EditText untuk kehilangan fokus pada kembali tekan.
Saya berharap seseorang menemukan ini berguna. Happy coding.
Solusinya sederhana:
onBackPressed()
menyebabkan Fragmen yang akan melepaskan diri dari Aktivitas.Menurut @Sterling Diaz menjawab saya pikir dia benar. TETAPI beberapa situasi akan menjadi salah. (ex. Memutar Layar)
Jadi, saya pikir kita bisa mendeteksi apakah
isRemoving()
untuk mencapai tujuan.Anda dapat menulis di
onDetach()
atauonDestroyView()
. Itu adalah pekerjaan.Anda harus menambahkan antarmuka untuk proyek anda seperti di bawah ini;
Dan kemudian, anda harus mengimplementasikan interface ini pada fragmen;
Dan anda dapat memicu ini onBackPressed acara dalam kegiatan anda onBackPressed acara seperti di bawah ini;
Yah aku melakukan hal seperti ini, dan itu bekerja untuk saya
Antarmuka yang sederhana
FragmentOnBackClickInterface.java
Contoh implementasi
MyFragment.java
kemudian hanya menimpa onBackPressed dalam kegiatan
Jika anda menggunakan EventBus, itu mungkin jauh lebih sederhana solusi :
dan di kelas Kegiatan anda anda dapat menentukan :
BackPressedMessage.java hanya POJO objek
Ini adalah super bersih dan tidak ada antarmuka/implementasi kerumitan.
Ini hanya sedikit kode yang akan melakukan trik:
Berharap itu membantu seseorang :)
ini adalah solusi saya:
Bagaimana menggunakan onDestroyView()?
dalam fragmen tambahkan berikut, jangan lupa untuk menerapkan mainactivity's antarmuka.
Sangat pendek dan manis menjawab:
Penjelasan dari seluruh skenario dari kasus saya:
Saya telah FragmentA di MainActivity, Aku membuka FragmentB dari FragmentA (FragmentB adalah anak atau bersarang fragmen FragmentA)
Sekarang jika anda ingin pergi ke FragmentA dari FragmentB anda hanya dapat menempatkan
getActivity().onBackPressed();
di FragmentB.Hanya ikuti langkah-langkah berikut:
Selalu sambil menambahkan fragmen,
Kemudian dalam kegiatan utama, menimpa
onBackPressed()
Untuk menangani tombol kembali di aplikasi anda,
Yang's itu!