如何在单/双窗格布局中管理UI状态和后端堆栈

qui*_*int 13 android android-lifecycle android-fragments android-orientation

我无法解决如何Fragment在典型的列表细节设计模式中正确管理s的问题.

我的布局工作正常,横向视图(双窗格)的结构如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ... >
    <FrameLayout android:id="@+id/list" ... />
    <FrameLayout android:id="@+id/container" ... />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

像这样的纵向视图(单个窗格):

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container" ... />
Run Code Online (Sandbox Code Playgroud)

我还有一个refs.xmlin res/values-w600dp/,以确保根据设备的屏幕宽度加载适当的布局.

选择列表项时,横向视图应并排显示列表和详细信息,而纵向视图应仅显示全屏详细信息.如果未选择任何内容,则横向视图应显示左侧的左侧和右侧的空白区域,而纵向视图应仅显示全屏列表.

例

但是,这是我遇到麻烦的地方:

  • 我是否使用"main" Activity作为列表+可选的详细信息布局,另一个"详细信息" Activity用于纵向,仅详细信息布局?这似乎是Fragments指南示例所做的.我已经得到了这个普遍的工作,但是当方向改变时,我如何保持我的细节片段的状态?

    考虑上面显示的相反情况 - 从纵向旋转到横向,同时细节可见意味着Activity需要finish()编辑细节,因此主要Activity可以显示双窗格布局,但这也会破坏细节片段及其细节savedInstanceState.如果用户EditText在详细信息片段的字段中键入了信息,然后旋转设备,当我将其添加到主(双窗格)时,如何保留详细信息片段的整个UI状态Activity

  • 我是否只使用一个ActivityFragment自己管理?这允许我在方向改变时保留细节UI的状态(因为Android会自动处理这个问题),但是当它涉及到后端堆栈时会变得混乱.

    考虑图像中的情况 - 当细节可见时应从横向旋转到纵向应显示单窗格显示详细信息,但如何正确管理后堆栈和ActionBar主页图标以显示列表单窗格?旋转回到横向还需要撤消我之前执行的任何后向堆栈操作,因为两个片段将立即可见.

经过一些搜索后,我发现了两个类似的问题(从双窗格切换到单窗格上的方向更改维护片段堆栈保留活动之间的片段状态),但我的情况略有不同,因为我不是要尝试改进此功能但是最好预先计划好.我错过了什么?当然,Android可以同时管理后台堆栈(如多个Activity案例) UI状态(如单个Activity案例中),对吧?

qui*_*int 6

我通过多个活动路线解决了这个问题. 请参阅我对"在活动之间保留碎片状态"的回答.

关键是FragmentManager.saveFragmentInstanceState()用于保存片段UI的状态,并Fragment.setInitialSavedState()在实例化另一个活动中的相同片段时恢复它.

出于我的目的,我发现我需要在两种情况下保存UI状态.我在public void saveState()片段中创建了一个辅助方法,并在使用片段的新实例附加到双窗格布局onPause()之前,立即从片段自己的方法以及我的"main"活动中调用它replace().

我仍然有兴趣知道这种类型的单/双窗格布局方案是否需要后向堆栈操作,或者单活动方法是否需要onBackPressed手动覆盖和模拟后端堆栈.