고객 코드가 있습니다. 모든 조각에 대해 단 하나의 활동이 있습니다. 즉, 단일 활동이 모든 조각을 관리합니다.
이 활동에는 해당 조각의 메서드 끝에있는 모든 조각에 대한 다음 코드가 포함되어 있습니다.
예를 들어-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()
실행했고 아무 문제 없이 실행 되었기 때문에이 코드는 쓸모없는 것 같습니다 .
답변
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
답변
의 tag
문자열은 addToBackStack(String name)
나중에 해당 위치로 직접 팝업하기 위해 백 스택을 찾는 방법을 제공합니다. 방법에서 사용되는 것을 의미합니다 popToBackStack(String name, int flags)
.
관리자의 조각 백 스택에서 마지막 조각 전환을 팝합니다. 이 함수는 비동기식입니다. 요청을 팝하기 위해 대기열에 넣지 만 애플리케이션이 이벤트 루프로 돌아올 때까지 작업이 수행되지 않습니다.
name : null이 아닌 경우 찾을 이전 백 상태의 이름입니다. 발견되면 해당 상태까지의 모든 상태가 표시됩니다. POP_BACK_STACK_INCLUSIVE 플래그는 명명 된 상태 자체가 팝되는지 여부를 제어하는 데 사용할 수 있습니다. null이면 최상위 상태 만 표시됩니다.
플래그 : 0 또는 POP_BACK_STACK_INCLUSIVE.
즉, name
in 에 의해 추가 된 조각을 찾을 때까지 백 스택을 팝합니다 .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 ()을 사용하고 있지 않은지 확인합니다.
답변
귀하의 답변은 더 이상 사용되지 않습니다. 백 스택에 조각을 추가하지 않으려면 아래 코드 조각을 사용해야합니다.
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);