0

也许我错过了关于片段的一些东西,但我无法理解这种行为:

我有一个带有 FrameLayout 的 Activity,其中包含一个片段。像往常一样,每次我更改方向创建一个新的 FrameLayout 实例时,活动都会被破坏。但我不想再次创建片段,我想保留相同的片段实例,因为它需要大量时间来加载。

我正在做的事情如下(假设 FrameLayout 的 id=324):

    FragmentManager mng = getFragmentManager();
    Fragment frag = (Fragment)mng.findFragmentByTag(DEFAULT_TAG);

    //I create a new fragment if it doesn't exist or I remove the fragment from any view that is attached if it existed
    if (frag==null) frag = new MyFragment();
    else mng.beginTransaction().remove(frag).commit();

    //I add the fragment to the newly created FrameLayout
    mng.beginTransaction().add(324, frag, DEFAULT_TAG).commit();

它崩溃了:

08-09 11:54:38.970: E/AndroidRuntime(2517): Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f050016, tag null, or parent id 0xffffffff with another fragment for com.test.PRMapFragment
08-09 11:54:38.970: E/AndroidRuntime(2517):     at android.app.Activity.onCreateView(Activity.java:4248)

第一次一切正常,但旋转屏幕时,它崩溃了。它抱怨 MyFragment 中的片段,但没有意义,因为片段没有改变。

4

1 回答 1

2

看看Fragment.setRetainInstance(): http: //developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

如果将其设置为true,它会更改片段生命周期,使其不会与活动一起被破坏和重新创建,而是会被分离并重新附加到新活动。它挂接到活动的onRetainNonConfigurationInstance()回调中,以使对象在配置更改之间保持活动状态。

我已经多次将其与不可见的片段一起使用,以允许长时间运行的操作跨配置更改工作。我还没有在带有视图的可见片段中尝试过它,但是小心你应该能够使用它。

于 2013-08-09T10:07:39.363 回答