프래그먼트를 사용하여 백 스택 지우기 . 이제 내 응용 프로그램은 여러 조각으로 구성된

내 안드로이드 앱을 허니컴으로 포팅했으며 조각을 사용하기 위해 큰 리팩터링을 수행했습니다. 이전 버전에서는 홈 버튼을 눌렀을 때 ACTIVITY_CLEAR_TOP백 스택을 재설정하기 위해 사용했습니다 .

이제 내 응용 프로그램은 여러 조각으로 구성된 단일 활동이므로 홈 버튼을 누르면 내부 조각 중 하나만 바꿉니다. 플래그 startActivity와 함께 사용하지 않고 백 스택을 지우려면 어떻게 ACTIVITY_CLEAR_TOP해야합니까?



답변

나는 비슷한 것을 여기에 올렸다.

Joachim의 답변, Dianne Hackborn의 답변 :

http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42

나는 단지 다음을 사용하여 끝났다.

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
    fm.popBackStack();
}

그러나 다음과 같이 사용할 수도 있습니다.

((AppCompatActivity)getContext()).getSupportFragmentManager().popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)

이름이 지정된 상태로 모든 상태가 팝업됩니다. 그런 다음 조각을 원하는 것으로 바꿀 수 있습니다.


답변

@Warpzit의 의견에 대한 답변을 만들고 다른 사람들이 더 쉽게 찾을 수 있도록하기 위해.

사용하다:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);


답변

모든 관련 당사자에 대한 모든 존중; 얼마나 많은 사람들이 간단한 조각으로 전체 조각 다시 스택을 지울 수 있는지 매우 놀랐습니다.

fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

안드로이드 문서 에 따르면 (논리와 관련 name하여 주장 된 작업 제안서의 “널”).

null의 경우, 최상위 상태 만이 팝된다

이제 특정 구현에 대한 지식이 부족하다는 것을 알고 있습니다 (예 : 주어진 시점에 백 스택에있는 항목 수). 잘 정의 된 것을 기대할 때 받아 들여진 대답에 모든 돈을 베팅 할 것입니다 광범위한 장치 및 공급 업체에서의 동작 :

(참고로 이것과 함께 뭔가)

FragmentManager fm = getFragmentManager(); // or 'getSupportFragmentManager();'
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
    fm.popBackStack();
}


답변

루프를 사용하지 않고 나를 위해 쉬운 방법으로 작동합니다.

 FragmentManager fragmentManager = getSupportFragmentManager();
 //this will clear the back stack and displays no animation on the screen
 fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);


답변

받아 들여진 대답으로는 충분하지 않았습니다. 나는 사용해야했다 :

FragmentManager fm = getSupportFragmentManager();
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
    fm.popBackStackImmediate();
}


답변

루프없이 명확한 백 스택

String name = getSupportFragmentManager().getBackStackEntryAt(0).getName();
getSupportFragmentManager().popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE);

여기서 name 은 addToBackStack () 매개 변수입니다.

getSupportFragmentManager().beginTransaction().
                .replace(R.id.container, fragments.get(titleCode))
                .addToBackStack(name)


답변

방금 추가하고 싶었습니다 :-

다음을 사용하여 백 스택에서 튀어 나옴

fragmentManager.popBackStack ()

트랜잭션에서 조각을 제거하는 것입니다. 화면에서 조각을 제거하지는 않습니다. 따라서 이상적으로는 보이지 않지만 두 개 또는 세 개의 조각이 서로 겹쳐져있을 수 있으며 뒤로 키를 누르면 UI가 어수선하게 쌓일 수 있습니다.

간단한 예를 들면 다음과 같습니다.

fragmentmanager.replace ()를 사용하여 Fragmnet B를로드하는 fragmentA가 있고 addToBackStack을 수행하여이 트랜잭션을 저장 한다고 가정하십시오 . 흐름은 :-

1 단계-> FragmentA-> FragmentB (FragmentB로 옮겼지만 Fragment A는 백그라운드에 있으며 보이지 않습니다).

이제 fragmentB에서 일부 작업을 수행하고 저장 버튼을 누릅니다. 저장 후 조각 A로 돌아갑니다.

2 단계-FragmentB를 저장하면 FragmentA로 돌아갑니다.

3 단계-> 그래서 일반적인 실수는 … 조각 B에서 조각 관리자로 조각 관리자 .replace () 조각 B를 수행합니다.

그러나 실제로 일어나는 일은 FragmentB를 대체하여 Fragment A를 다시로드하고 있습니다. 이제 두 개의 FragmentA가 있습니다 (하나는 STEP-1에서, 하나는이 STEP-3에서).

FragmentsA의 두 인스턴스가 서로 겹쳐져 표시되지 않을 수 있지만 거기에 있습니다.

따라서 위의 방법으로 백 스택을 지우더라도 트랜잭션은 지워지지 만 실제 조각은 지워지지 않습니다. 따라서 이상적으로는 저장 버튼을 누르면 fm.popBackStack () 또는 fm.popBackImmediate () 를 수행하여 fragmentA로 돌아 가면됩니다 .

따라서 올바른 Step3-> fm.popBackStack ()은 이미 메모리에있는 fragmentA로 돌아갑니다.