旋转时如何动态更改布局以避免重新启动activity

when rotate how to dynamically change layout to avoid re-start activity

在横向模式下,具有水平并排 A 和 B 部分的布局。假设 A 占据屏幕的 1/3,B 占据另外 2/3。 旋转时需要的是 A 保持其原始宽度,但更改为覆盖在 B 之上,B 更改为在 A 下方具有全屏宽度。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">  

   <FrameLayout
      android:id="@+id/left_part"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="0.3" />
   <FrameLayout
      android:id="@+id/right_part"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="0.7" />
 </LinearLayout>

A 部分和 B 部分是不同片段的持有者,它有它与光标等的适配器,并且可以在 backstack 中堆叠一些。因此,当 rotate 宁愿不重新启动 activity 以便维护上下文时,而只是一些如何动态重新排列布局。

不确定是否可行。有什么建议吗? 谢谢!

Handling the Configuration Change Yourself

您的 activity 应该在新布局中使用 saved instance state to persist the data from the old layout and restore it

理论上可以定义一个布局,其中包含来自不同方向的子组,填充它们,然后使用上面提到的方法在发生旋转时显示/隐藏它们自己处理它,但你最好这样做坚持 Android 的股票机制来处理这个问题。

似乎它应该与动态更改布局一起工作,尝试了以下显示预期的行为。 如果发现此方法有任何问题或有更好的解决方案,请发表评论。谢谢!

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">  

    <FrameLayout
      android:id="@+id/right_pane"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_alignParentRight="true"
      android:layout_alignParentLeft="false"
      android:layout_toRightOf="@+id/left_part" />


  <FrameLayout
     android:id="@+id/left_part"
     android:layout_width="@dimen/left_part_width"
     android:layout_height="match_parent"
     android:layout_alignParentLeft="true"/>

 </RelativeLayout>


void doChangeMode() {

    RelativeLayout.LayoutParams leftLp = (RelativeLayout.LayoutParams) leftPart.getLayoutParams();
    RelativeLayout.LayoutParams rightLp = (RelativeLayout.LayoutParams) rightPart.getLayoutParams();

    if (mode == mode_side_by_side) {
        mode = mode_overlap;
        rightLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    } else {
        mode = mode_side_by_side;
        rightLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);

        //api 17 above
        //rightLp.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
    }
    Handler delayHandler = new Handler();
    delayHandler.post(new Runnable() {
        @Override
        public void run() {
            rootView.requestLayout();

        }
    });
}