android - 设备旋转后子 fragment 中的过时 Activity 引用

标签 android android-fragments xamarin.android

我有一个包含多个子 fragment 的 fragment 。我使用以下代码将子 fragment 放置在父布局中:

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

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

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)

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

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

最佳答案

显然,这正是 Android 框架的工作原理。如果在父 fragment 上将 RetainInstance 设置为 true,则子 fragment 会简单地通过轮换全部保留。 Activity 引用永远不会在子 fragment 中更新。

我已经证实这在原生 Android (Java) 和 MonoDroid 中同样有效。

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

关于android - 设备旋转后子 fragment 中的过时 Activity 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21150155/

相关文章:

android - Facebook App 链接(深层链接)不适用于移动浏览器

android - LibGDX 声音问题

c# - 开发需要哪些Android SDK包?

android - 选择 fragment A 时如何不在 ViewPager 上一起启动所有 fragment

asynchronous - 异步 block 中的 Xamarin Android F# 更新 UI

c# - 使用 Azure IOT 库创建 Xamarin.Forms .Net Standard 应用程序?

java - 多平台安卓应用

android - eclipse android 通用 xml 编辑器停止正确(随机)呈现文本

android-fragments - MvvmCross V5自动从Activity导航

android - 我收到 Caused by : android. view.InflateException : Binary XML file line #32: Error inflating class androidx. fragment.app.FragmentContainerView