Когда повернуть, как динамически изменить макет, чтобы избежать повторного запуска деятельности

Наличие макета, в котором горизонтальные части 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 для справиться с этим.

Другие вопросы по тегам