gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:09:54 25 4
gpt4 key购买 nike

我有一个包含多个子 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com