ฉันมีปัญหาใหญ่เกี่ยวกับวิธีที่ส่วนแบ็คสแต็กของ Android ใช้งานได้และจะขอบคุณมากที่สุดสำหรับความช่วยเหลือใด ๆ ที่มีให้
ลองนึกภาพคุณมี 3 Fragments
[1] [2] [3]
ฉันต้องการให้ผู้ใช้จะสามารถนำทาง[1] > [2] > [3]
แต่ในทางกลับ [3] > [1]
(กดปุ่มด้านหลัง)
อย่างที่ฉันคิดไว้ว่าสิ่งนี้จะทำได้โดยการไม่โทรaddToBackStack(..)
เมื่อสร้างธุรกรรมที่นำส่วน[2]
เข้าสู่ตัวยึดส่วนที่กำหนดไว้ใน XML
ความจริงของเรื่องนี้ดูเหมือนกับว่าว่าถ้าผมไม่ต้องการ[2]
ที่จะปรากฏขึ้นอีกครั้งเมื่อผู้ใช้กดปุ่มย้อนกลับบน[3]
ผมต้องไม่เรียกในการทำธุรกรรมที่ส่วนแสดงให้เห็นว่าaddToBackStack
[3]
สิ่งนี้ดูเหมือนจะสวนทางกันโดยสิ้นเชิง (อาจมาจากโลก iOS)
อย่างไรก็ตามถ้าฉันทำแบบนี้เมื่อฉันไป[1] > [2]
และกดกลับฉันก็กลับมา[1]
ตามที่คาดไว้
ถ้าฉันไป[1] > [2] > [3]
แล้วกดกลับฉันจะข้ามกลับไปที่[1]
(ตามที่คาดไว้) ตอนนี้พฤติกรรมแปลกที่เกิดขึ้นเมื่อฉันพยายามและข้ามไปอีกครั้งจาก[2]
[1]
ก่อนอื่น[3]
จะแสดงสั้น ๆ ก่อนที่จะ[2]
เข้าสู่มุมมอง หากฉันกดย้อนกลับที่จุดนี้[3]
จะปรากฏขึ้นและหากฉันกดย้อนกลับอีกครั้งแอปจะออก
ใครช่วยให้ฉันเข้าใจว่าเกิดอะไรขึ้นที่นี่?
และนี่คือไฟล์ xml เลย์เอาต์สำหรับกิจกรรมหลักของฉัน:
<?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"
/>
อัปเดต นี่คือรหัสที่ฉันใช้สร้างโดย 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]
ขอบคุณมาก