Android方向改变:不同布局,相同片段。

6
这基本上是一个经典的Android用例。
假设我们有两个片段:FragmentA和FragmentB。
在横向模式下,FragmentA和FragmentB并排放置。
在纵向模式下,它们各自占用整个屏幕。
(请参见此图像,但替换tablet-> landscape和handset-> portrait) Different Layout, Same Fragments on Orientation Change支持单窗格和多窗格布局所述,有两种方法可以实现此目标。

1- 多个片段,一个活动:无论设备大小如何,都使用一个活动,但在运行时决定是否将片段组合在布局中(创建多窗格设计)或交换片段(创建单窗格设计)。

2- 多个片段,多个活动:在平板电脑上,将多个片段放置在一个活动中;在手机上,使用单独的活动来托管每个片段。例如,当平板电脑设计在一个活动中使用两个片段时,对于手机,使用相同的活动,但提供一个替代布局,只包括第一个片段。在手机上运行并需要切换片段(例如用户选择项目时),启动另一个托管第二个片段的活动。

这在理论上很有道理,但我在尝试实际实现这两种方法以一种能够在方向更改和返回按钮按下时恢复片段状态的方式时遇到了一些困难。

我尝试了第一种方法,并取得了相当大的进展,但发现它很混乱,因为它需要手动管理所有片段事务,特别是因为片段的容器不能轻易地更改。在返回按钮按下时决定要做什么也很麻烦,因为后退栈上的最后一笔交易可能属于另一种方向。

现在我正在尝试第二个选项。到目前为止,它似乎更清洁,但是片段会在每次方向更改时从头开始重建(因为每个方向使用不同的 Activity)。我希望有一种方法可以从其他 Activity/方向中恢复 Fragment 的状态。
有人能解释一下如何做到这一点,或者指向一个适当的教程或示例应用程序吗?

1
通常情况下,不建议在同一设备上从双窗格切换到单窗格方法(由于从双窗格到单窗格时的心理模型不同,可能会导致混淆)。这就是为什么你很少看到这种模式,而更多地看到适应横向单窗格或纵向双窗格的更细粒度的布局更改的原因之一。 - ianhanniballake
我不明白你所说的“我想要一种方法从其他Activity/屏幕方向来恢复Fragment状态”的意思。这里的“其他Activity”指的是什么? - Dinash
1个回答

5
  • MainActivity 中,当 Fragment 被替换时添加以下配置: <activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboard|keyboardHidden" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT"/></intent-filter> </activity
  • FragmentAFragmentB 创建横向布局 enter image description here
  • 如果需要更改两个 Fragment 的行为,则应更改 onConfigurationChanged 事件的 Fragment。

@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 编写适用于横向布局的代码 } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { // 编写适用于纵向布局的代码 } }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接