旋转时如何动态更改布局以避免重新启动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 以便维护上下文时,而只是一些如何动态重新排列布局。
不确定是否可行。有什么建议吗?
谢谢!
您的 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();
}
});
}
在横向模式下,具有水平并排 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 以便维护上下文时,而只是一些如何动态重新排列布局。
不确定是否可行。有什么建议吗? 谢谢!
您的 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();
}
});
}