1

我有一个包含片段的布局:

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

我在这个片段的 onCreate 方法中设置了这个使用 setRetainInstance(true) :

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

最后,我还在其活动 onCreate 中恢复了对该片段的引用:

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

但是,每次我旋转我的设备时,都会调用活动的 onCreate ,然后也会调用片段的 onCreate !由于我将 setRetainInstance 设置为 true,因此它不应该发生。这种行为有原因吗?

4

1 回答 1

2

我最近遇到了这个问题,并且与它斗争了几个小时,直到我发现在包含 onSaveInstanceState 中保留的非 UI 片段的 Activity 的代码(我从某个第三方库复制的)中没有调用到 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() 不会在保留的片段中调用两次。

我希望这会对某人有所帮助:)

于 2016-04-14T20:34:03.090 回答