如何添加Fragment,使其不会在整个活动重新创建过程中保留



我正在动态地向"活动"添加视图和从中删除视图。这些视图中的每一个都被分配了一个id,并充当特定片段的容器。我用条件逻辑为这些视图中的每一个添加一个片段,如下所示:

if (supportFragmentManager.findFragmentById(R.id.someView) == null) {
supportFragmentManager.beginTransaction()
.add(R.id.someView, SomeFragment())
.commit()
}

此条件逻辑确保给定视图在"活动"的生存期内只添加一次片段。

除非重新创建"活动"(例如,由于配置更改(,否则此逻辑工作正常。重新创建活动时,视图不会自动重新创建,但碎片似乎在重新创建后仍然存在。(我看到碎片在重新创建后幸存了下来,因为supportFragmentManager.findFragmentById(id:)调用返回了一个非空碎片。(

我发现,如果我用Activity.onCreate(savedInstanceState:)方法将Views重新添加到我的Activity中,那么保留的Fragments会重新附着到Views,一切都很好。但是,如果我延迟将视图添加到"活动"生命周期中的稍后点,则碎片不会重新附加到视图(视图显示为空白(。

最终,当savedInstanceState为非null时,这会导致我的Activity.onCreate(savedInstanceState:)方法中的逻辑混乱。要么我必须重新添加视图,就像它们在活动被破坏时一样(我更喜欢在活动的其他地方这样做(,要么我必须调用FragmentTransaction.remove(fragment:)来删除重新创建后幸存的每个片段。

有没有一种方法可以将片段添加到活动中,从而使片段无法在活动再创造中存活?我在Fragment.setRetainInstance(retain:(方法的弃用通知中看到,指导是:";不要保留片段本身,而是使用未保留的片段,并在附加到该片段的ViewModel中保持保留状态"然而,本指南并未就如何定义非保留片段给出任何说明。

这个答案有几个维度。

首先,我在FragmentManager或FragmentTransaction类中找不到任何文档或方法,它们提供了创建非保留Fragment的方法。不推荐使用的Fragment.setRetainInstance(retain:(方法中的文档中说;非保留片段";但我找不到任何地方可以解释这意味着什么。

其次,解决此问题的方法是删除包含Activity的onCreate(savedInstanceState:)方法中保留的片段,以便在以后的生命周期方法中重新创建有问题的片段并将其附加到其包含视图,如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.some_activity)
supportFragmentManager.findFragmentById(R.id.someView)?.let {
supportFragmentManager.beginTransaction().remove(it).commit()
}
}

相关内容

最新更新