gpt4 book ai didi

android - 不了解 setRetainInstance(或 Xamarin Android 中的 RetainInstance)的工作原理?

转载 作者:行者123 更新时间:2023-11-29 17:15:49 27 4
gpt4 key购买 nike

如果您在 XML 布局文件中声明了一些 Fragment,那么 SetRetainInstance 看起来可以正常工作。

但是,如果在主 ActivityOnCreate 回调中将 Fragment 动态加载到某个容器中会怎样?在这种情况下,我看不出 setRetainInstance 的含义或功能。

检查这段代码:

protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
var f = new SomeFragment();
var ft = FragmentManager.BeginTransaction();
ft.Replace(Android.Resource.Id.Content, f);
ft.Commit();
}

可以看到每次OnCreate被调用时(比如屏幕旋转时),都会创建一个新的SomeFragment并填充Activity的主要内容。

现在即使我声明一个变量(字段)持有对 fragment 实例的引用并仅在它为 null 时创建它,如下所示:

SomeFragment f;
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
if(f == null) {
f = new SomeFragment(this);
f.RetainInstance = true;
}
var ft = FragmentManager.BeginTransaction();
ft.Replace(Android.Resource.Id.Content, f);
ft.Commit();
}

这也不行,每次创建Activity时,字段f最初还是null(不保留)。我发现在这里工作的唯一解决方案是将字段 f 声明为静态,如下所示:

static SomeFragment f;

有了它,我什至不需要使用 RetainInstance(或 Java 中的 setRetainInstance)。事实上,动态加载 Fragments 的需求非常流行,所以在这一点上 RetainInstance 似乎没那么有用?

或者我错过了一些简单的东西来继续利用 RetainInstance?问题是使用RetainInstance和动态加载Fragments,如果你有一些解决方案或模式可以在这里使用,请与我分享,谢谢!

最佳答案

虽然我对 Xamarin 不熟悉,但我可以用 Java 回答这个问题。

而不是使用

replace(int containerViewId, Fragment fragment)

你应该使用

replace(int containerViewId, Fragment fragment, String tag)

例如,

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment;
fragment = (ExampleFragment) fragmentManager.findFragmentByTag("tag");
if(fragment == null)
fragment = new ExampleFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment, "tag");
fragmentTransaction.commit();

但是如果您在后台运行较长的任务,您应该只使用 setRetainInstance。你可以看看 this blog post .更建议重新创建 fragment ,因为它可以避免意外行为(例如,不初始化某些变量)。

关于android - 不了解 setRetainInstance(或 Xamarin Android 中的 RetainInstance)的工作原理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070517/

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