백 스택에서 복원 된 조각을 확인하는 방법
잠시 동안이 문제를 검색했지만 지금은 소용이 없습니다.
백 스택에서 조각이 복원되고 있는지 확인하는 방법은 무엇입니까? 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
'IT이야기' 카테고리의 다른 글
Eclipse의 모든 소스 파일에 표준 주석 헤더 추가 (0) | 2021.03.28 |
---|---|
CodeMirror 2-하이라이트만 (편집기 없음) (0) | 2021.03.28 |
setTimeout 루프를 중지하는 방법 (0) | 2021.03.28 |
MongoDB에서 컬렉션의 이름 바꾸는 방법 (0) | 2021.03.27 |
C ++에서 키 업데이트로 최소 우선 순위 대기열을 사용하는 가장 쉬운 방법 (0) | 2021.03.27 |