Saya menggunakan Komponen Arsitektur Navigasi baru di android dan saya terjebak dalam membersihkan tumpukan navigasi setelah pindah ke fragmen baru.
Contoh: Saya berada di loginFragment dan saya ingin fragmen ini dihapus dari tumpukan saat saya menavigasi ke fragmen beranda sehingga pengguna tidak akan kembali ke loginFragment saat dia menekan tombol kembali.
Saya menggunakan NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) sederhana untuk menavigasi.
Kode Saat Ini:
mAuth.signInWithCredential(credential)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
} else {
Log.w(TAG, "signInWithCredential:failure", task.getException());
}
}
});
Saya mencoba menggunakan NavOptions di navigation () , tetapi tombol kembali masih mengirim saya kembali ke loginFragment
NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);
android
android-fragments
android-architecture-components
android-architecture-navigation
Youssef El Behi
sumber
sumber
popBackStack
atau tidak menambahkanLoginFragment
untuk backstack menyediakannull
untukaddToBackStack(null);
dan menggantinya dengan yang baruFragment
navigate()
metode sepertinavigate(int resId, Bundle args, NavOptions navOptions)
dan memberikanNavOptions
yang paling sesuai dengan senario AndaJawaban:
Pertama, tambahkan atribut
app:popUpTo='your_nav_graph_id'
danapp:popUpToInclusive="true"
ke tag tindakan.Kedua, navigasikan ke tujuan, menggunakan tindakan di atas sebagai parameter.
Lihat dokumen untuk informasi lebih lanjut.
CATATAN : Jika Anda menavigasi menggunakan metode
navigate(@IdRes int resId)
, Anda tidak akan mendapatkan hasil yang diinginkan. Oleh karena itu, saya menggunakan metodenavigate(@NonNull NavDirections directions)
.sumber
findNavController(fragment).navigate(R.id.action_signInFragment_to_usersFragment)
Dalam kasus saya, saya perlu menghapus semua yang ada di Stack belakang sebelum saya membuka fragmen baru jadi saya menggunakan kode ini
baris pertama menghapus Stack belakang sampai mencapai fragmen yang ditentukan dalam kasus saya itu adalah fragmen home sehingga menghapus semua back stack sepenuhnya, dan ketika pengguna mengklik kembali di fragment_company dia menutup aplikasi.
sumber
fragment_apps
??Saya pikir pertanyaan Anda secara khusus berkaitan dengan cara menggunakan Pop Behavior / Pop To / app: popUpTo (dalam xml)
Dalam dokumentasi,
Munculkan ke tujuan tertentu sebelum menavigasi. Ini memunculkan semua tujuan yang tidak cocok dari tumpukan belakang hingga tujuan ini ditemukan.
Contoh (Aplikasi berburu Pekerjaan Sederhana) grafik start_screen_nav
saya seperti ini:
jika saya ingin menavigasi ke
EmployerMainFragment
dan memunculkan semua termasukstartScreenFragment
maka kodenya adalah:jika saya ingin menavigasi ke
EmployerMainFragment
dan memunculkan semua yang tidak termasukstartScreenFragment
maka kodenya adalah:jika saya ingin menavigasi ke
EmployerMainFragment
dan munculloginFragment
tetapi tidakstartScreenFragment
maka kodenya adalah:ATAU
sumber
CATATAN: Tugas yang jelas tidak digunakan lagi, deskripsi resmi tidak digunakan
Jawaban Lama
Jika Anda tidak ingin melihat semua kode fuzz itu, Anda cukup check-
Clear Task
inLaunch Options
di properti tindakan.Edit: Mulai Android Studio 3.2 Beta 5, Hapus Tugas tidak lagi terlihat di jendela Opsi Peluncuran, tetapi Anda masih dapat menggunakannya dalam kode XML navigasi, dalam tag tindakan , dengan menambahkan
sumber
Saya akhirnya mengetahuinya berkat Bagaimana cara menonaktifkan UP di Navigasi untuk beberapa fragmen dengan Komponen Arsitektur Navigasi baru?
Saya harus menentukan .setClearTask (true) sebagai NavOption.
sumber
navigate(int resId, Bundle args, NavOptions navOptions)
danNavOptions
val navOptions = NavOptions.Builder().setPopUpTo(R.id.my_current_frag, true).build()
findNavController().navigate(R.id.my_next_frag, null, navOptions)
R.id.my_next_frag
seperti login atau splash screen); juga jika Anda ingin popBack hanya satu, Anda dapat menggunakan:NavHostFragment.findNavController(this).popBackStack()
.Inilah cara saya menyelesaikannya.
sumber
false
?inclusive boolean: true to also pop the given destination from the back stack
Jadi, saya menetapkan inklusif ke false karena saya tidak ingin mengeluarkan fragmen saat ini dari tumpukan.sumber
Anda dapat mengganti penekanan belakang dari aktivitas dasar seperti ini:
sumber
Catatan: Ini mungkin tidak berhubungan dengan pertanyaan sebenarnya.
Pendekatan ini akan berguna jika satu instance fragmen perlu dipertahankan dalam Navigasi .
Ini
navOptions
adalah DSL dan perlu diimpor. Pada saat jawaban ini saya menggunakan UI Navigasi versi gradle berikut .sumber
Saya berjuang sebentar untuk mencegah tombol kembali kembali ke fragmen awal saya, yang dalam kasus saya adalah pesan intro yang seharusnya hanya muncul sekali.
Solusi yang mudah adalah dengan membuat tindakan global yang menunjuk ke tujuan yang harus dituju oleh pengguna. Anda harus menyetelnya
app:popUpTo="..."
dengan benar - setel ke tujuan yang Anda inginkan untuk dimunculkan. Dalam kasus saya, itu adalah pesan intro saya. Juga diaturapp:popUpToInclusive="true"
sumber
Saya bisa menjelaskan ini melalui contoh kecil. Saya memiliki dua fragmen daftar karyawan dan menghapus karyawan. Dalam menghapus karyawan, saya memiliki dua peristiwa klik membatalkan dan menghapus. Jika saya mengklik batal, maka cukup kembali ke layar daftar karyawan dan jika saya klik hapus maka saya ingin menghapus semua backstacks sebelumnya dan pergi ke layar daftar karyawan.
Untuk membuka layar sebelumnya:
Untuk menghapus semua backstack sebelumnya dan pergi ke layar baru:
Untuk referensi lebih lanjut: Contoh Navigasi Jetpack
sumber
Anda dapat melakukan sesederhana:
Jika Anda ingin memeriksa hitungan, Anda dapat melakukan seperti:
sumber