2012-02-23 4 views
13

나는 자신의 상태 (선택된 버튼 등)를 가진 조각을 가지고있다. 그 상태는 화면 회전에서 사라집니다.왜 내 조각 onSaveInstanceState()가 호출되지 않습니까?

조각이 포함 된 활동에는/res/layout /에 세로 레이아웃이 있고/res/layout-land /에는 거의 동일한 가로 레이아웃이 있습니다. 두 레이아웃은 조각과 같이 포함 :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <fragment 
     android:id="@+id/testFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     class="au.com.x.y.TestFragment" /> 
...</LinearLayout> 

내가 함께 테스트를 봤는데 조각 클래스는 다음에서 가져 나는 조각에 대한 사전 3.0 지원 패키지를 사용하고

public class TestFragment extends android.support.v4.app.Fragment { 
    private static final String TAG = "TestFragment"; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.i(TAG, "onCreate(): " + 
       (savedInstanceState != null ? "NOT NULL" : "NULL")); 
    } 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Log.i(TAG, "onActivityCreated(): " + 
       (savedInstanceState != null ? "NOT NULL" : "NULL")); 
    } 
    public void onSaveInstanceState(Bundle state) { 
     super.onSaveInstanceState(state); 
     Log.i(TAG, "onSaveInstanceState()"); 
     state.putString("saved_thing", "some_value"); 
    } 
    public View onCreateView(
     LayoutInflater inflater, 
     ViewGroup container, 
     Bundle b) { ... } 
} 

주, ActionBarSherlock을 통해. 당신이 볼 수 있듯이, onSaveInstanceState()가 호출되지 않습니다

BEFORE SCREEN ROTATION (PORTRAIT): 
02-23 11:45:58.015: I/TestFragment(22629): onCreate(): NULL 
02-23 11:45:58.015: I/TestFragment(22629): onCreateView() 
02-23 11:45:58.035: I/TestFragment(22629): onActivityCreated(): NULL 
AFTER SCREEN ROTATION (LANDSCAPE): 
02-23 11:46:00.615: I/TestFragment(22629): onCreate(): NULL 
02-23 11:46:00.615: I/TestFragment(22629): onCreateView() 
02-23 11:46:00.635: I/TestFragment(22629): onActivityCreated(): NULL 

, 그리고 조각은 항상 onCreate()onActivityCreated() 모두에서 널 savedInstanceState를 가져옵니다

로그 캣이 날 수 있습니다.

나는 내 활동 인 onCreate()에서 myFragment.setRetainInstance(true)을 시도했지만 아무 것도 변경하지 않았습니다.

onSaveInstanceState()에는 @Override가 있으므로 오타와 같은 무언가가 아닙니다.

ActionBarSherlock 예제 (com.actionbarsherlock.sample.shakespeare) 중 하나를 살펴본 결과 해당 메서드가 제대로 호출 된 onSaveInstanceState() 메서드가 있습니다. 내가 알 수있는 한,이 예제는 레이아웃과 레이아웃 랜드 XML을 통해 내 코드가 — 조각 인 방식으로 정확하게 작성된 것입니다. 필자는 주 프로젝트가 사용하고있는 것과 동일한 버전의 ActionBarSherlock을 사용하여 샘플을 빌드했으며 인스턴스 상태를 저장하면 해당 예제가 올바르게 작동합니다.

화면 회전간에 조각 상태를 유지하려면 어떻게해야합니까? onSaveInstanceState()이 (가) 호출되지 않는 이유는 무엇입니까?

+0

시도해보고 @Override'onPause()'/'onResume()'. –

+1

순환 순서는 onPause(), onDestroy(), onCreate(), onCreateView(), onActivityCreated(), onResume()입니다. savedInstanceState는 여전히 항상 null이고 onSaveInstanceState()는 호출되지 않습니다. onSaveInstanceState()를 명시 적으로 호출 할 필요가 없어야한다고 확신합니다. – George

+0

두 개의 다른 장소 (세로 레이아웃 대 가로 레이아웃)에서 참조되는 프래그먼트와 관련된 문제가 있습니까? 아마 이것들이 안드로이드에게 상태를 공유해서는 안되는 두 개의 다른 조각이라는 신호인가? – George

답변

23

상태를 유지하려면 myFragment.setRetainInstance(true)을 활성화 할 수 있지만 '자동'입니다. 즉, 클래스 멤버에게 할당 된 값을 유지하며 onSaveInstanceState를 사용하지 않습니다. 따라서 savedInstanceState는 항상 null입니다.

이 조각을 호스트하는 FragmentActivityonSaveInstanceState을 덮어 쓰지 않는지 확인하십시오. 그렇지 않으면 super.onSaveInstanceState(Bundle)을 호출해야합니다.

+4

Arg! 내 Activity에서 super.onSaveInstanceState()를 호출하지 않았다. 대답 에릭 고마워. 내 머리를 찢어 버리고 있었어. – George

0

회전 할 때 조각에 다른 레이아웃 리소스가 필요한 경우 setRetainInstance(true)을 사용할 수 없습니다. 이 page은 조각의 수명주기를 setRetainInstance(true)으로 표시합니다.

원래 아이디어는 일반적인 활동과 마찬가지로 모든 회원 데이터를 유지하기 위해을 사용합니다. 그러나 어떤 이유로 든 onSaveInstanceState()이 호출되지 않습니다. 그러나 @Eric Kok이 제안한대로 FragmentActivity은 정확합니다. 가장 좋은 해결책은 인수 of Fragment를 사용하는 것입니다.

solutionFyodor Volchyok으로 보면 간단합니다. onSaveInstanceState()에 outState이 있고 onViewCreated()에 savedInstanceState이있는 것처럼 작업하십시오.

관련 문제