programing

조각을 사용하여 백스택 지우기

muds 2023. 7. 30. 18:08
반응형

조각을 사용하여 백스택 지우기

저는 제 안드로이드 앱을 벌집으로 포팅했고 조각을 사용하기 위해 큰 리팩터를 했습니다.이전 버전에서는 홈 버튼을 누를 때 사용했습니다.ACTIVITY_CLEAR_TOP백업 스택을 재설정하기 위해.

이제 제 앱은 여러 개의 조각이 있는 단일 활동이므로 홈 버튼을 누르면 그 안에 있는 조각 중 하나만 교체합니다.도 백스택을 수 방법은 입니까?startActivityACTIVITY_CLEAR_TOP 발깃?

여기에 비슷한 글을 올렸습니다.

요아힘의 대답, 다이앤 해크본의 대답:

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);

Android 설명서에 따르면 (관련)name인수 - 청구된 작업 제안서의 "내용").

null인 경우 최상위 상태만 팝됩니다.

이제 귀사의 특정 구현에 대한 지식이 부족하다는 것을 알고 있습니다(예: 특정 시점에 백스택에 있는 항목 수). 하지만 광범위한 기기 및 공급업체에서 명확하게 정의된 동작을 기대할 때는 승인된 답변에 모든 돈을 걸 것입니다.

(참고로, 이것과 함께 무언가)

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

루프 없이 백스택 지우기

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 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();
}

안녕하세요~ 저는 https://gist.github.com/ikew0ng/8297033 에서 훨씬 더 나은 솔루션을 찾았습니다.

    /**
 * Remove all entries from the backStack of this fragmentManager.
 *
 * @param fragmentManager the fragmentManager to clear.
 */
private void clearBackStack(FragmentManager fragmentManager) {
    if (fragmentManager.getBackStackEntryCount() > 0) {
        FragmentManager.BackStackEntry entry = fragmentManager.getBackStackEntryAt(0);
        fragmentManager.popBackStack(entry.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}

그냥 덧붙이고 싶었어요 :--

다음을 사용하여 백스택에서 팝업 표시

fragmentManager.popBackStack()

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

간단한 예를 들어 보겠습니다.

fragmentmanager.replace()사용하여 Fragmentmnet B를 로드하는 fragment A가 있다고 가정하고, 그런 다음 이 트랜잭션을 저장하기 위해 ToBackStack을 추가합니다.그래서 흐름은 다음과 같습니다.

STEP 1 -> Fragment A -> Fragment B (Fragment B로 이동했지만, Fragment A는 보이지 않고 백그라운드에 있습니다.)

이제 fragmentB에서 몇 가지 작업을 수행하고 Save(저장) 버튼을 누릅니다. 저장 후 fragmentA로 돌아갑니다.

STEP 2-> FragmentB를 저장하고 FragmentA로 돌아갑니다.

3단계 ->그러므로 일반적인 실수는 것입니다.fragment B에서 fragment Manager.replace() fragment B를 fragment A로 하겠습니다.

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

조각 A의 두 인스턴스가 서로 겹쳐 쌓이고, 이는 보이지 않을 수 있지만 실제로 존재합니다.

따라서 위의 방법으로 백스택을 삭제하더라도 트랜잭션은 삭제되지만 실제 fragment는 삭제되지 않습니다.따라서 이러한 특정한 경우 저장 버튼을 누르면 fm.popBackStack() 또는 fm.popBackImediate()수행하여 fragmentA로 돌아가기만 하면 됩니다.

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

이 근처의 코틀린 사람들을 위해:

repeat(supportFragmentManager.backStackEntryCount) {
    supportFragmentManager.popBackStack()
}

설명서를 읽고 fragment id가 무엇인지 연구하면 단순히 스택 인덱스인 것처럼 보이기 때문에 다음과 같이 작동합니다.

fragmentManager.popBackStackImmediate(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);

0)0맨, 는 스택의 맨 아래에 있으므로, 여기에 포함하여 팝업하면 스택이 지워집니다.

주의: 위의 내용이 제 프로그램에서 작동하지만, FragmentManager 문서에서 id가 스택 인덱스라는 것을 실제로 명시하지 않기 때문에 조금 망설여집니다.그럴 수도 있고, 모든 디버그 로그를 통해 알 수 있지만, 어떤 특별한 상황에서는 그렇지 않을 수도 있습니다.누가 이것을 어떻게든 확인할 수 있습니까?그렇다면 위의 방법이 가장 좋습니다.그렇지 않은 경우 다음과 같은 방법이 있습니다.

while(fragmentManager.getBackStackEntryCount() > 0) { fragmentManager.popBackStackImmediate(); }

이 방법을 사용하여 컨텍스트 & 프래그먼트 태그를 백테이크 조각 제거에 필요한 위치로 전달하면 됩니다.

사용.

clearFragmentByTag(context, FragmentName.class.getName());



public static void clearFragmentByTag(Context context, String tag) {
    try {
        FragmentManager fm = ((AppCompatActivity) context).getSupportFragmentManager();

        for (int i = fm.getBackStackEntryCount() - 1; i >= 0; i--) {
            String backEntry = fm.getBackStackEntryAt(i).getName();
            if (backEntry.equals(tag)) {
                break;
            } else {
                 fm.popBackStack();
            }
        }
    } catch (Exception e) {
        System.out.print("!====Popbackstack error : " + e);
        e.printStackTrace();
    }
}

효과가 있습니다. 이것을 사용해 보십시오.

public void clearFragmentBackStack() {
        FragmentManager fm = getSupportFragmentManager();
        for (int i = 0; i < fm.getBackStackEntryCount() - 1; i++) {
            fm.popBackStack();
        }
    }

이런 식으로 작동하게 되었습니다.

public void showHome() {
    getHandler().post(new Runnable() {
        @Override
        public void run() {
            final FragmentManager fm = getSupportFragmentManager();
            while (fm.getBackStackEntryCount() > 0) {
                fm.popBackStackImmediate();
            }
        }
    });
}
    private void clearBackStack(){
        SupportFragmentManaer fm = getSupportFragmentManager();
        fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

이 방법을 호출하는 것은 매우 깔끔할 것입니다.

  1. 루프가 필요하지 않습니다.
  2. 단편 애니메이션을 사용하는 경우 애니메이션이 너무 많이 표시되지 않습니다.하지만 루프를 사용하면 됩니다.
private boolean removeFragFromBackStack() {
    try {
        FragmentManager manager = getSupportFragmentManager();
        List<Fragment> fragsList = manager.getFragments();
        if (fragsList.size() == 0) {
            return true;
        }
        manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

언급URL : https://stackoverflow.com/questions/6186433/clear-back-stack-using-fragments

반응형