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

时间:2016-05-13 23:21:19

标签: android layout orientation-changes

在横向模式下具有水平并排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部分是不同碎片的持有者,它有光标等的adapetr,并且可能有一些堆叠在背堆中。因此,当旋转更喜欢不重新启动活动以便维护上下文,而只是一些如何动态重新排列布局。

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

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您的活动应该使用saved instance state将旧布局和restore it中的数据保存到新布局中。

从理论上讲,可以定义一个具有不同方向子组的单个布局,将它们填充,然后使用上面提到的方法显示/隐藏它们,以便自己处理它,但是你是最好不要使用Android的股票机制来处理这个问题。

答案 2 :(得分:0)

似乎应该可以使用动态更改布局,尝试以下显示预期的行为。 如果看到此方法的任何问题或有更好的解决方案,请发表评论。谢谢!

<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();

        }
    });
}