Saya punya masalah besar dengan cara kerja fragmen android backstack dan akan sangat berterima kasih atas bantuan yang ditawarkan.
Bayangkan Anda memiliki 3 Fragmen
[1] [2] [3]
Saya ingin pengguna dapat menavigasi [1] > [2] > [3]
tetapi dalam perjalanan kembali (menekan tombol kembali) [3] > [1]
.
Seperti yang saya bayangkan, ini akan dilakukan dengan tidak memanggil addToBackStack(..)
saat membuat transaksi yang membawa fragmen [2]
ke pemegang fragmen yang ditentukan dalam XML.
Kenyataannya seolah-olah jika saya tidak ingin [2]
muncul lagi ketika pengguna menekan tombol kembali [3]
, saya tidak boleh memanggil addToBackStack
transaksi yang menunjukkan fragmen [3]
. Ini tampaknya benar-benar kontra-intuitif (mungkin berasal dari dunia iOS).
Bagaimanapun jika saya melakukannya dengan cara ini, ketika saya pergi dari [1] > [2]
dan menekan kembali saya tiba kembali [1]
seperti yang diharapkan.
Jika saya pergi [1] > [2] > [3]
dan kemudian menekan kembali saya melompat kembali ke [1]
(seperti yang diharapkan). Sekarang perilaku aneh terjadi ketika saya mencoba dan melompat [2]
lagi dari [1]
. Pertama-tama [3]
ditampilkan secara singkat sebelum [2]
terlihat. Jika saya menekan kembali saat ini [3]
ditampilkan, dan jika saya menekan kembali sekali lagi aplikasi akan keluar.
Adakah yang bisa membantu saya untuk memahami apa yang terjadi di sini?
Dan berikut ini file layout xml untuk aktivitas utama saya:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/headerFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
class="com.fragment_test.FragmentControls" >
<!-- Preview: layout=@layout/details -->
</fragment>
<FrameLayout
android:id="@+id/detailFragment"
android:layout_width="match_parent"
android:layout_height="fill_parent"
/>
Perbarui Ini adalah kode yang saya gunakan untuk membangun oleh nav heirarchy
Fragment frag;
FragmentTransaction transaction;
//Create The first fragment [1], add it to the view, BUT Dont add the transaction to the backstack
frag = new Fragment1();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.commit();
//Create the second [2] fragment, add it to the view and add the transaction that replaces the first fragment to the backstack
frag = new Fragment2();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.addToBackStack(null);
transaction.commit();
//Create third fragment, Dont add this transaction to the backstack, because we dont want to go back to [2]
frag = new Fragment3();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.commit();
//END OF SETUP CODE-------------------------
//NOW:
//Press back once and then issue the following code:
frag = new Fragment2();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.addToBackStack(null);
transaction.commit();
//Now press back again and you end up at fragment [3] not [1]
Terimakasih banyak