我正在创建一个新的Android项目,不久将启动android可折叠设备。我有一个活动,其中有一个片段称为第一个片段。 “第一个片段”具有一个名为“第一个按钮”的按钮,该按钮可打开第二个片段,该第二个片段具有一个名为“第二个”的按钮,并在单击第二个片段时会打开第三个片段。
假设用户位于第三个片段中,并且用户决定展开其设备,该用户将返回第一个片段,还是停留在第三个片段中。据我在开发者峰会上了解到的那样,当用户展开设备时,该活动将被破坏并重新创建,因此从技术上讲,用户会回到第一个片段,从而导致糟糕的用户体验。
所以我的问题是我是否应该甚至使用碎片?,如果是的话,该如何管理状态,以便用户折叠或展开设备时使用与他相同的碎片。
以下是我的代码,如果我要更改片段
private fun displayView(fragment: Fragment?, title: String) {
if (fragment != null) {
supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
supportFragmentManager.beginTransaction()
.replace(R.id.framelayout_activity_main, fragment, title).commit()
}
}
答案 0 :(得分:1)
在onCreate()
中,如果正在执行此活动,则只想执行FragmentTransaction
新创建的,而不是从配置更改中重新创建。或者,更准确地说,
如果您还没有想要的片段,则只想执行FragmentTransaction
。
因此,一种典型的方法是查看容器中是否已经有片段:
override fun onCreate(state: Bundle) {
super.onCreate(state)
if (supportFragmentManager.findFragmentById(R.id.framelayout_activity_main) == null) {
// do something to show your fragment
}
// other good stuff goes here
}
在第一次onCreate()
调用中,findFragmentById()
将返回null
,因此您将执行代码以显示第一个片段。在配置更改后的后续onCreate()
调用中,Android将在调用onCreate()
时为您设置您的片段。因此,在这种情况下,findFragmentById()
将返回null
以外的其他值,因此您知道容器中已经有一个片段,不需要执行任何其他操作。