Tôi đã gặp một vấn đề lớn với cách hoạt động của backstack phân mảnh android và rất biết ơn nếu có bất kỳ sự trợ giúp nào được cung cấp.
Hãy tưởng tượng bạn có 3 mảnh vỡ
[1] [2] [3]
Tôi muốn người dùng có thể điều hướng [1] > [2] > [3]
nhưng đang trên đường quay lại (nhấn nút quay lại) [3] > [1]
.
Như tôi đã tưởng tượng, điều này sẽ được thực hiện bằng cách không gọi addToBackStack(..)
khi tạo giao dịch đưa phân đoạn [2]
vào trình giữ phân đoạn được định nghĩa trong XML.
Thực tế của điều này dường như là nếu tôi không muốn [2]
xuất hiện lại khi người dùng nhấn nút quay lại [3]
, tôi không được gọi addToBackStack
trong giao dịch hiển thị phân đoạn [3]
. Điều này có vẻ hoàn toàn phản trực quan (có lẽ đến từ thế giới iOS).
Dù sao nếu tôi làm theo cách này, khi tôi đi từ [1] > [2]
và nhấn lại, tôi sẽ quay trở lại [1]
như mong đợi.
Nếu tôi đi [1] > [2] > [3]
và sau đó nhấn trở lại, tôi sẽ quay lại [1]
(như mong đợi). Bây giờ hành vi kỳ lạ xảy ra khi tôi thử và nhảy [2]
lại từ đó [1]
. Trước hết [3]
được hiển thị ngắn gọn trước khi [2]
xuất hiện. Nếu tôi nhấn lại vào thời điểm [3]
này sẽ hiển thị và nếu tôi nhấn lại một lần nữa, ứng dụng sẽ thoát.
Bất cứ ai có thể giúp tôi hiểu chuyện gì đang xảy ra ở đây?
Và đây là tệp xml bố cục cho hoạt động chính của tôi:
<?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"
/>
Cập nhật Đây là mã tôi đang sử dụng để xây dựng bởi 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]
Cảm ơn nhiều