null 매개 변수가있는 addToBackStack의 의미는 무엇입니까?


93

고객 코드가 있습니다. 모든 조각에 대해 단 하나의 활동이 있습니다. 즉, 단일 활동이 모든 조각을 관리합니다.

이 활동에는 해당 조각의 메서드 끝에있는 모든 조각에 대한 다음 코드가 포함되어 있습니다.

예를 들어-MoreFragment 조각 :

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

그래서,

1) addToBackStack(null)뒤에 a 의 의미는 무엇입니까 commit()?

2) 널 매개 변수를 전달해야하는 이유는 무엇 addToBackStack입니까?

3) 이렇게 추가 된 후 그 조각을 얻는 방법은 무엇입니까?

마지막 줄없이 코드를 .addToBackStack(null).commit()실행했고 아무 문제 없이 실행 되었기 때문에이 코드는 쓸모없는 것 같습니다 .


developer.android.com/reference/android/app/… 경우에 따라 해당 메서드를 호출해야합니다.
Lucifer


3
Null 대신 addToBackStack (name)에 조각 이름을 매개 변수로 전달할 수 있습니다. Null을 전달하면 FragmentManager.popBackStackImmediate (String name, int flags); 메서드를 사용할 수 없습니다. 또는 popBackStack (문자열 이름, int 플래그); 이름이 Null이기 때문입니다. 따라서 popBackstack 메서드는 작동하지 않습니다. null을 전달하는 대신 매개 변수로 Fragment 이름을 전달하는 것이 좋습니다.
luckylukein 2016 년

답변:


111

addToBackStack (null) 뒤에 commit ()의 의미는 무엇입니까?

인용 문서 :

addToBackStack ()을 호출하면 교체 트랜잭션이 백 스택에 저장되므로 사용자는 뒤로 버튼을 눌러 트랜잭션을 되돌리고 이전 조각을 다시 가져올 수 있습니다.

트랜잭션에 여러 변경 사항 (예 : 다른 add () 또는 remove ())을 추가하고 addToBackStack ()을 호출하면 commit ()을 호출하기 전에 적용된 모든 변경 사항이 단일 트랜잭션 및 뒤로 버튼으로 백 스택에 추가됩니다. 모두 함께 되돌릴 것입니다.

FragmentTransaction에 변경 사항을 추가하는 순서는 다음을 제외하고는 중요하지 않습니다.

당신은 전화해야합니다 commit()마지막으로 . 동일한 컨테이너에 여러 조각을 추가하는 경우 추가하는 순서에 따라 뷰 계층 구조에 나타나는 순서가 결정됩니다.

그래서 마지막에 커밋해야합니다.

addToBackStack에 null 매개 변수를 전달해야하는 이유는 무엇입니까?

null 일 필요는 없으며 문자열 일 수 있습니다. 원하지 않으면 null을 전달하십시오.

공용 추상 FragmentTransaction addToBackStack (문자열 이름)

API 레벨 11에 추가됨이 트랜잭션을 백 스택에 추가합니다. 즉, 트랜잭션이 커밋 된 후 기억되고 나중에 스택에서 튀어 나오면 작업을 되돌립니다.

매개 변수 name이 백 스택 상태에 대한 선택적 이름 또는 null입니다.

에 관하여:

마지막 줄 .addToBackStack (null) .commit ()없이 코드를 실행했고 아무 문제없이 실행되었으므로이 코드는 쓸모가없는 것 같습니다.

이전 조각으로 이동하려면 백 스택에 추가하십시오. 따라서 조각을 백 스택에 추가할지 여부에 따라 다릅니다.

이렇게 추가 된 후 해당 조각을 얻는 방법은 무엇입니까?

이미 조각 인스턴스가 있습니다. firstFragment 있습니다. 그래서 나는 나중에 조각을 얻는 것이 무엇을 의미하는지 모르겠습니다.

추가 정보 @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


API 문서의 답변에 이것을 추가 할 수도 있습니다.이 트랜잭션을 백 스택에 추가합니다. 즉, 트랜잭션이 커밋 된 후에 기억되고 나중에 스택에서 튀어 나오면 해당 작업이 취소됩니다. 매개 변수 name이 백 스택 상태에 대한 선택적 이름 또는 null입니다.
Dyrborg 2014

그래서 내가 이해했듯이 백 스택에 추가하는 모든 목적은 이전 조각으로 이동하기 위해 뒤로 버튼을 사용하는 것처럼 탐색을 수행하는 것입니다.
My God

좋아요 그래서 매개 변수를 addToBackStack에 전달한다면 왜 getFragmentManager().popBackStackImmediate()뒤로 버튼이 매개 변수 전달을 사용하거나 사용하지 않고 스스로 할 수 있다면 왜해야 할까요? -의 대답을 참조하십시오 stackoverflow.com/questions/21156153/...
나의 하나님

@VedPrakash 당신이 필요하지 않습니다. 또한 그것은 완전히 다른 질문과 대답입니다. 당신은 쉽게 다시 스택에 추가 두 조각을 가지고 다시 버튼을 눌러 밖으로 자신을 찾을 수 있습니다
Raghunandan


17

tag문자열은 addToBackStack(String name)나중에 해당 위치로 직접 팝업하기 위해 백 스택을 찾는 방법을 제공합니다. 방법에서 사용되는 것을 의미합니다 popToBackStack(String name, int flags).

관리자의 조각 백 스택에서 마지막 조각 전환을 팝합니다. 이 함수는 비동기식입니다. 요청을 팝하기 위해 대기열에 넣지 만 애플리케이션이 이벤트 루프로 돌아올 때까지 작업이 수행되지 않습니다.

name : null이 아닌 경우 찾을 이전 백 상태의 이름입니다. 발견되면 해당 상태까지의 모든 상태가 표시됩니다. POP_BACK_STACK_INCLUSIVE 플래그는 명명 된 상태 자체가 팝되는지 여부를 제어하는 ​​데 사용할 수 있습니다. null이면 최상위 상태 만 표시됩니다.

플래그 : 0 또는 POP_BACK_STACK_INCLUSIVE.

즉, namein 에 의해 추가 된 조각을 찾을 때까지 백 스택을 팝합니다 .addToBackStack(String name) .

예를 들어 "frag1", "frag2", "frag3", "frag4"라는 이름을 부여하는 프래그먼트 관리자에 일련의 추가 또는 교체를 수행하고 나중에 addToBackStack ( "으로 추가 된 프래그먼트 2로 직접 돌아 가고자하는 경우) frag2 ")를 호출하면 popToBackStack("frag2", 0).

그래서,

  • 사용 .addToBackStack("fragName"): 나중에 popToBackStack(String name, int flags)두 개 이상의 백 스택을 팝 하려는 경우 .

  • 사용 .addToBackStack(null): 나중에 두 개 이상의 백 스택을 터 뜨리고 싶지 않지만 한 번에 하나씩 터 뜨리고 싶은 경우. popToBackStack ()을 명시 적으로 호출하지 않더라도 백 프레스 기본 구현이 백 스택을 처리하도록 할지라도이 작업을 수행하십시오.

  • 사용 .disallowAddToBackStack(): 뒤로 누르기를 원하지 않거나 popBackStack ()을 명시 적으로 호출합니다. 코드의 어떤 부분도 .addToBackStack ()을 사용하고 있지 않은지 확인합니다.


1

귀하의 답변은 더 이상 사용되지 않습니다. 백 스택에 조각을 추가하지 않으려면 아래 코드 조각을 사용해야합니다.

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

아래에 사용 방법에 대한 귀여운 예가 있습니다.

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
어디에서 사용되지 않습니까? 설명서 또는 FragmentTransaction 소스에 아무것도 표시되지 않습니다.
Rup

3
만약 당신이한다면 disallowAddToBackStack, 이후 에 addToBackStack을 호출하면 IllegalStateException이 발생할 것입니다. addToBackStack이 이미 호출 된 경우이 메소드는 IllegalStateException을 발생시킵니다.
Kathir 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.