2013-04-02 2 views
1

У меня есть макет, содержащий фрагмент:Фрагмент с retainInstance = верно, но OnCreate называется

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/root" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <fragment 
     android:id="@+id/ID" 
     class="com.teovald.app.MyFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <include 
     android:id="@+id/toolbar" 
     layout="@layout/toolbar" /> 

</FrameLayout> 

Я установить этот вариант использования setRetainInstance (истина) в этом фрагменте OnCreate метод:

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setRetainInstance(true); 
    ....} 

И наконец, я восстанавливаю ссылку на этот фрагмент в своей деятельности по созданию:

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    mFragment = (MyFragment) fragmentManager.findFragmentById(R.id.ID);  
    ... 
} 

Однако e ach time Я вращаю свое устройство, onCreate активности вызывается, затем onCreate фрагмента также называется! Поскольку я установил setRetainInstance в true, это не должно происходить. Есть ли причина для такого поведения?

+1

Это может иметь что-то делать с жизненным циклом и, как все завышены из XML ... Вы могли бы рассмотреть возможность сделать 'FragmentManager fragmentManager = getSupportFragmentManager(); mFragment = (MyFragment) fragmentManager.findFragmentById (R.id.ID); 'in' onStart()' или 'onResume' вместо этого ... – JRaymond

+0

Спасибо за предложение. Однако оставить только super.onCreate & setContentView не помогло. Не заменяет ActionBarSherlock и библиотеку совместимости на последние библиотеки баз данных. Это должно быть что-то еще, но у меня заканчиваются варианты: - / – Teovald

ответ

2

У меня была эта проблема недавно, и я боролся с ней в течение нескольких часов, пока не обнаружил, что в коде (который я скопировал из какой-то третьей библиотеки) из Activity, которая содержит сохраненный не-u-фрагмент в onSaveInstanceState не было вызова super.onSaveInstanceState()

Это было похоже, что:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    // Save the mapview state in a separate bundle parameter 
    final Bundle mapviewState = new Bundle(); 
    mMapFragment.onSaveInstanceState(mapviewState); 
    outState.putBundle(BUNDLE_STATE_MAPVIEW, mapviewState); 
} 

Поэтому я добавил недостающую вызов быть как:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    // Save the mapview state in a separate bundle parameter 
    final Bundle mapviewState = new Bundle(); 
    mMapFragment.onSaveInstanceState(mapviewState); 
    outState.putBundle(BUNDLE_STATE_MAPVIEW, mapviewState); 
} 

И теперь onCreate() не вызывается дважды в сохраненном фрагменте.

Я надеюсь, что это поможет кто-нибудь :)