Fragment의 화면 이동에 푹 빠졌어요.

12071 단어 AndroidKotlin

하고 싶은 일


Fragment에서 제작한 화면 A, B, C가 있고 A->B->C로 바뀝니다.
C에서 후진 버튼을 눌렀을 때 B를 건너뛰고 A로 돌아가고 싶다

레이아웃 디자인


기본 레이아웃

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

화면 A의 배치

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#00000000"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button"
        android:text="Fragment A Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

화면 B의 레이아웃

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#00000000"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button"
        android:text="Fragment B Button"
        android:layout_gravity="right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

화면 C의 레이아웃

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00000000">

    <Button
        android:id="@+id/button"
        android:text="Fragment C Button"
        android:layout_gravity="bottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

화면 마이그레이션 처리


화면 A 추가 처리

    val transaction = supportFragmentManager.beginTransaction()
    transaction.add(R.id.container, FragmentA.newInstance())
    transaction.commit()

화면 B로 이동 처리

    val transaction = fragmentManager.beginTransaction()
    transaction.replace(R.id.container, FragmentB.newInstance())
    transaction.addToBackStack(null)
    transaction.commit()

화면 C로 변환 처리

    val transaction = fragmentManager.beginTransaction()
    transaction.replace(R.id.container, FragmentC.newInstance())
    // Bを飛ばしてAに戻りたいのでbackStack追加しない
    //transaction.addToBackStack(null) 
    transaction.commit()
위의 설치에서 화면 A->B->C로 이동하여 백버튼을 누르면 왠지 모르게 화면 A와 화면 C가 모두 표시됩니다.

원인


http://extra-vision.blogspot.jp/2016/02/android-fragment-transaction-back-stack.html
위의 링크를 참조했습니다.
ddToBackStack은 fragment를 창고에 쌓는 지령이 아니라 fragment 작업의 업무를 기록하는 지령입니다. 키를 눌렀을 때의 처리는 창고에 쌓인 fragment pop이 아니라 기록된 업무를 반대로 하는 것입니다.
이번 상황에서.
원본 트랜잭션 처리가 기록되지 않음
반복 트랜잭션 기록
replace(fragment C) 트랜잭션을 기록하지 않음
replace는 내부에서remove와add를 연속적으로 진행하기 때문에 전개할 때
원본 트랜잭션 처리가 기록되지 않음
remove(fragment A),add(fragment B) 트랜잭션 기록
remove(fragment B),add(fragment C) 사무를 기록하지 않음
되다이 상태에서 후진 키를 누르면 기록된 업무의 상반된 조작으로 인해
remove(fragment A),add(fragment B) 트랜잭션 기록
상반된 조작
remove(fragment B), add(fragment A)
fragmentA가 맨 앞에 표시되고 fragmentC가 남아 있습니다.

해결 방법


화면 C에서 후진 키를 눌렀을 때의 처리 연결고리, 자신을 죽인 후 popBackStack
    fragmentManager.beginTransaction().remove(this).commit()
    fragmentManager.popBackStack()
또는 addToBackStack에서 태그를 미리 지정하고 태그 지정에서 popBackStack을 수행합니다.
    transaction.replace(R.id.container, FragmentB.newInstance())
    transaction.addToBackStack("fragmentA")
....
....
    fragmentManager.popBackStack("fragmentA", FragmentManager.POP_BACK_STACK_INCLUSIVE)

좋은 웹페이지 즐겨찾기