【问题标题】:Obsolete Activity reference in child fragment after device rotation设备旋转后子片段中的过时 Activity 引用
【发布时间】:2014-03-20 04:25:13
【问题描述】:

我有一个带有几个子片段的片段。我使用以下代码将子片段放置在父布局中:

public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ...

    var transaction = ChildFragmentManager.BeginTransaction ();
    if (ChildFrag == null) {
        var childFragment = new ChildFragment ();
        transaction.Replace (Resource.Id.child_fragment_container, childFragment, ChildFragment.FragmentTag);
    }
    ... place other fragments

    transaction.Commit ();
}

ChildFragment ChildFrag {
    get {
        return ChildFragmentManager.FindFragmentByTag (ChildFragment.FragmentTag) as ChildFragment;
    }
}

在设备旋转之后,我可以看到父片段引用了新创建的 Activity,但子片段仍然引用了旧的(旋转前)Activity 实例。当我在配置更改后尝试执行任何片段事务时,这会成为一个问题。例如,启动对话框会产生以下错误:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
at myapp.myviews.SpinnerRow.n_onClick(Native Method)
at myapp.myviews.SpinnerRow.onClick(SpinnerRow.java:68)
at android.view.View.performClick(View.java:4475)
at android.view.View$PerformClick.run(View.java:18786)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
at dalvik.system.NativeStart.main(Native Method)

什么会导致子片段引用过时的 Activity?

this post 中提供的解决方案是不保留父片段。我需要保留片段。

【问题讨论】:

    标签: android android-fragments xamarin.android


    【解决方案1】:

    显然,这就是 Android 框架的工作原理。如果父 Fragment 上的 RetainInstance 设置为 true,则子 Fragment 只需通过轮换批发保留。活动引用永远不会在子片段中更新。

    我已经验证这在原生 Android (Java) 和 MonoDroid 中的工作方式相同。

    解决方案是在父片段上将RetainInstance设置为false,然后使用OnSaveInstancestate()FragmentManager.SaveFragmentInstanceState和Fragment.SetInitialSavedState()的组合通过轮换确保状态保存。

    【讨论】:

      【解决方案2】:

      我为这个问题找到了一种更简单的方法,嵌套片段保留了对它所附加的前一个 Activity 的过时引用,但父片段没有,所以最好调用 getParentFragment.getActivity()为了参考实际活动而不是以前的活动。

      【讨论】:

      • 是的。这也有效。它有时会使设计复杂化,因为它要求子片段知道它是否在父片段中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      相关资源
      最近更新 更多