IT이야기

백 스택에서 복원 된 조각을 확인하는 방법

cyworld 2021. 3. 28. 09:33
반응형

백 스택에서 복원 된 조각을 확인하는 방법


잠시 동안이 문제를 검색했지만 지금은 소용이 없습니다.

백 스택에서 조각이 복원되고 있는지 확인하는 방법은 무엇입니까? FragmentActivity 내에서 호환성 라이브러리와 ListFragment를 사용하고 있습니다. ListFragment 내의 항목이 선택되면 ListFragment를 대체하기 위해 새 Fragment가 시작됩니다.

FragmentActivity가 일시 중지되면 Fragment의 onSaveInstanceState가 호출됩니다. 그러나 Fragment를 FragmentTransaction을 통해 백 스택에 넣을 때 onSaveInstanceState가 호출되지 않으면 onCreateView 및 onActivityCreated 수명주기 메서드가 null savedInstanceState Bundle과 함께 호출됩니다.

Fragment가 생성되거나 복원 될 때 일부 데이터를로드하고 싶지만 사용자가 돌아올 때는 그렇지 않기 때문에 이것을 묻습니다. 백 스택.

백 스택에서 조각이 복원되었는지 확인하는 방법을 살펴 보았습니다 . 그러나 이것이 대답을 유도하기를 희망하면서 더 많은 세부 사항을 추가하고 싶습니다.

편집 : 방금 http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle)가 말합니다

그러나이 메서드는 onDestroy () 전에 언제든지 호출 할 수 있습니다. 조각이 대부분 찢어 질 수있는 상황이 많이 있지만 (예 : UI가 표시되지 않은 상태로 백 스택에 배치되는 경우) 소유 활동이 실제로 상태를 저장해야 할 때까지 상태가 저장되지 않습니다.

따라서 onSaveInstanceState는 확실히 의문의 여지가 없습니다 ...


가장 간단한 방법은 예를 들어 onViewCreated () 메서드에서 수행하는 것입니다.

if (savedInstanceState == null && !mAlreadyLoaded) {
    mAlreadyLoaded = true;

    // Do this code only first time, not after rotation or reuse fragment from backstack
}

안드로이드가 프래그먼트를 백 스택에 넣을 때 뷰만 파괴하고 인스턴스 자체를 죽이지 않기 때문에 mAlreadyLoaded는 프래그먼트가 백 스택에서 복원 될 때 여전히 true입니다.


getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {    
            public void onBackStackChanged() {
                Log.i(TAG, "back stack changed ");
                int backCount = getSupportFragmentManager().getBackStackEntryCount();
                if (backCount == 0){
                                   // block where back has been pressed. since backstack is zero.
                }
            }
        });

이 addOnBackStackChangedListener를 사용하십시오.


조각이 백 스택으로 갈 때 onDestroyView()호출됩니다. 아닙니다 onDestroy().

그리고 조각이 백 스택에서 튀어 나오면 onCreateView()호출됩니다. 아닙니다 onCreate().

따라서 boolean mIsRestoredFromBackstack조각에 추가 하고 다음과 같이 따르십시오.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    mIsRestoredFromBackstack = false;
}

@Override
public void onResume()
{
    super.onResume();
    if(mIsRestoredFromBackstack)
    {
        // The fragment restored from backstack, do some work here!
    }
}

@Override
public void onDestroyView()
{
    super.onDestroyView();
    mIsRestoredFromBackstack = true;
}

주요 편집 : 2013 년 10 월 15 일

이전 설명 (참조를 위해 아래에 보관 됨)은 응용 프로그램이 백그라운드로 전환되고 다시 포 그라운드로 돌아 오면 실패합니다.

대신 백 스택의 현재 크기를 프래그먼트가 생성되어 백 스택에 넣을 때의 크기와 비교하는 것이 좋습니다.


http://developer.android.com/guide/components/fragments.html#Creating의 그림 2를 잘 살펴보십시오.

이 그림이 알려주는 것은 조각이 백 스택에서 복원 될 때 onCreate ()는 호출되지 않고 onCreateView ()는 호출된다는 것입니다.


따라서 다음과 같이 할 수 있습니다.

public class MyFragment extends Fragment {
    int mBackStackSize = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBackStackSize = getFragmentManager().getBackStackEntryCount();
    }

    public boolean isRestoredFromBackstack() {
        return mBackStackSize > getFragmentManager().getBackStackEntryCount();
    }
}

백 스택에 프래그먼트를 추가하고 일부 조작 후 fragmentTransaction.hide (fragment)를 사용하여 숨긴 다음 fragmentTransaction.show (fragmentManager.findFragmentByTag (fragment.getName ()));와 같이 백 스택에서 복원합니다. onHiddenChanged (boolean hidden)을 재정의 할 수 있습니다.

@Override
public void onHiddenChanged(boolean hidden) {
    // TODO Auto-generated method stub
    super.onHiddenChanged(hidden);
    if (!hidden) {
        //fragment became visible
        //your code here
    }
}

어떤 경우에는 isVisible 메서드를 사용 하여 조각이 처음 표시되는지 아니면 백 스택에서 복원되는지 이해할 수 있습니다.


Fragment.getFragmentManager() == null 

추가 전과 팝 후

ReferenceURL : https://stackoverflow.com/questions/7919681/how-to-determine-fragment-restored-from-backstack

반응형