在横向模式下具有水平并排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,并且可能有一些堆叠在背堆中。因此,当旋转更喜欢不重新启动活动以便维护上下文,而只是一些如何动态重新排列布局。
不确定它是否可行。有什么建议吗? 谢谢!
答案 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();
}
});
}