Когда повернуть, как динамически изменить макет, чтобы избежать повторного запуска деятельности
Наличие макета, в котором горизонтальные части A и B расположены горизонтально в ландшафтном режиме. Допустим, А занимает 1/3 экрана, а В - 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 предпочел бы не перезапускать действие, чтобы сохранить контекст, а просто кое-как, как перестроить макет динамически.
Не уверен, что это выполнимо. Любое предложение? Спасибо!
3 ответа
Кажется, он должен работать с динамическим изменением макета, попробовал следующее показывает ожидаемое поведение. Пожалуйста, прокомментируйте, если видите какие-либо проблемы с этим подходом или у вас есть лучшее решение Спасибо!
<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();
}
});
}
Ваша деятельность должна использовать сохраненное состояние экземпляра, чтобы сохранить данные из старого макета и восстановить его в новом макете.
Теоретически возможно определить один макет, который имеет подгруппы из разных ориентаций, заполнить их обе, а затем показать / скрыть их, когда вращение происходит, используя метод, описанный выше, для самостоятельной обработки, но лучше придерживаться стандартного механизма Android для справиться с этим.