Fragment의 화면 이동에 푹 빠졌어요.
하고 싶은 일
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)
Reference
이 문제에 관하여(Fragment의 화면 이동에 푹 빠졌어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomo1139/items/62902093d1850085742d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
기본 레이아웃
<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)
Reference
이 문제에 관하여(Fragment의 화면 이동에 푹 빠졌어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomo1139/items/62902093d1850085742d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
val transaction = supportFragmentManager.beginTransaction()
transaction.add(R.id.container, FragmentA.newInstance())
transaction.commit()
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.container, FragmentB.newInstance())
transaction.addToBackStack(null)
transaction.commit()
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.container, FragmentC.newInstance())
// Bを飛ばしてAに戻りたいのでbackStack追加しない
//transaction.addToBackStack(null)
transaction.commit()
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)
Reference
이 문제에 관하여(Fragment의 화면 이동에 푹 빠졌어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomo1139/items/62902093d1850085742d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
fragmentManager.beginTransaction().remove(this).commit()
fragmentManager.popBackStack()
transaction.replace(R.id.container, FragmentB.newInstance())
transaction.addToBackStack("fragmentA")
....
....
fragmentManager.popBackStack("fragmentA", FragmentManager.POP_BACK_STACK_INCLUSIVE)
Reference
이 문제에 관하여(Fragment의 화면 이동에 푹 빠졌어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomo1139/items/62902093d1850085742d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)