나는 안드로이드 프래그먼트 백 스택이 작동하는 것처럼 보이는 방식에 큰 문제가 있으며 제공되는 도움에 가장 감사 할 것입니다.
3 개의 조각이 있다고 상상해보세요
[1] [2] [3]
사용자가 탐색 할 수 [1] > [2] > [3]
있지만 돌아가는 중 (뒤로 버튼 누름)을 원합니다 [3] > [1]
.
내가 상상했듯이 XML에 정의 된 조각 홀더로 addToBackStack(..)
조각을 가져 오는 트랜잭션을 만들 때 호출하지 않음으로써이 작업을 수행 할 수 있습니다 [2]
.
이것의 현실은 [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"
/>
업데이트 이것은 탐색 계층 구조로 빌드하는 데 사용하는 코드입니다.
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]
많은 감사