Android方向更改:不同的布局,相同的碎片

时间:2015-06-01 02:09:59

标签: android android-fragments android-orientation

这几乎是一个经典的Android用例。

假设我们有2个片段:FragmentA和FragmentB。

在横向模式下,FragmentA和FragmentB并排放置。

在纵向模式下,它们在使用时都会占据整个屏幕。

(请参阅此图片,但更换平板电脑 - >横向和手机 - >肖像) Different Layout, Same Fragments on Orientation Change

如此处所述(Supporting Single-Pane and Multi-Pane Layouts),有两种方法可以实现这一目标:

  

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

     

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

这在理论上很有意义,但是我试图以一种方式实现这些方法中的任何一个方面遇到一些障碍,即在方向改变时恢复碎片的状态并按下后退按钮

我尝试了第一种方法并且相当远,但发现它很乱,因为它需要手动管理所有片段事务,特别是因为片段的容器不能轻易更改。决定在后退时做什么也是一种痛苦,因为后台上的最后一笔交易可能属于另一个方向。

现在我正在尝试第二种选择。到目前为止它看起来更干净,但片段会在每次方向更改时从头开始重新创建(因为每个方向使用不同的Activity)。 我想有办法从其他活动/方向恢复片段状态。

任何人都可以解释如何做到这一点,或者指向适当的教程或示例应用程序吗?

1 个答案:

答案 0 :(得分: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
  • 您已为 FragmentA FragmentB 创建片段横向布局 enter image description here
  • 如果您需要更改两个片段的行为,则应更改 onConfigurationChanged 片段事件。

@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { //write your stuff for landscape orientation }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { //write your stuff for portrait orientation } }