在Android Foldable上管理片段

时间:2018-11-18 12:50:26

标签: android android-fragments

我正在创建一个新的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()
        }
    }

1 个答案:

答案 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以外的其他值,因此您知道容器中已经有一个片段,不需要执行任何其他操作。