Как обновить match_parent в linearLayout после использования setRotation?

У меня есть несколько вложенных макетов, которые я пытаюсь повернуть на 90 градусов по запросу в коде. У меня есть функция setRotation, которая работает отлично, но, к сожалению, с вращением не меняется. Ширина на этих элементах установлена ​​в match_parent, а после вращения она по-прежнему соответствует родительской ширине, а не родительской высоте, которую должна соответствовать.

XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mainLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="link.basiclifecounter.LifeCounter" android:background="#CC00CC"> <LinearLayout android:id="@+id/topPlayers" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:orientation="vertical" android:background="#CC0000"> <RelativeLayout android:id="@+id/p3" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> **A bunch of stuff in here** </RelativeLayout> <RelativeLayout android:id="@+id/p2" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> **A bunch of stuff in here** </RelativeLayout> </LinearLayout> <LinearLayout android:id="@+id/bottomPlayer" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="vertical" android:background="#00CC00"> <RelativeLayout android:id="@+id/p1" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> **A bunch of stuff in here** </RelativeLayout> </LinearLayout> </LinearLayout> 

Вращающийся Java-код

 view.findViewById(R.id.topPlayers).setRotation(90); //Rotate the entire top box view.findViewById(R.id.p3).setRotation(180); //Flip one side so both players face outwards 

На этом снимке отображается изображение до начала вращения.

На этом снимке отображается изображение после поворота.

Как вы можете видеть, вся коробка была повернута после того, как высота и ширина уже установлены. В невращающейся версии ширина (match_parent) должна быть полной, а высота (layout_weight = 2) должна быть 2 / 3rds экрана. Это работает отлично. Проблема в том, что он вращается, эти размеры остаются неизменными, а не адаптируются и меняются на новое вращение.

Я выбрал яркие цвета фона, чтобы помочь устранить неполадки, что Pink, который вы видите, находится в главном LinearLayout, а не в любом из макетов, которые вращаются.

Я попытался включить вращение в самом XML, а не внутри кода, и получил то же самое, что и изображение после снимка, поэтому я явно не понимаю, как получить ширину макета так, как я хочу. Могу ли я просто не использовать layout_weight эффективно с вращением?

Solutions Collecting From Web of "Как обновить match_parent в linearLayout после использования setRotation?"

Я думаю, что у вас такая же проблема, как и в этом вопросе переполнения стека . Похоже, что ротация просто не учитывается для целей макета. Другими словами, происходит компоновка, тогда вращение происходит с представлениями, изложенными перед вращением.

Этот ответ на тот же вопрос может вам помочь.

Вы также можете вручную отрегулировать измерения. В любом случае это немного грязно, но я думаю, что так оно и есть.


Вы можете загрузить альтернативный макет, который будет вести себя так, как вам хочется, вместо того, чтобы делать поворот. (См. Макет и изображение ниже.) Вы также можете добиться того же результата, изменяя параметры макета программно.

Вот проект GitHub, который демонстрирует вращение программно. Вид поворачивается после паузы в течение трех секунд.

Надеюсь, вы найдете это полезным.

Введите описание изображения здесь

alternate.xml

  <LinearLayout android:id="@+id/topPlayers" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:background="#CC0000" android:orientation="horizontal"> <RelativeLayout android:id="@+id/p3" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical" android:rotation="90"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="p3" android:textSize="48sp" /> </RelativeLayout> <RelativeLayout android:id="@+id/p2" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="#0000CC" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:rotation="-90" android:text="p2" android:textSize="48sp" /> </RelativeLayout> </LinearLayout> <LinearLayout android:id="@+id/bottomPlayer" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#00CC00" android:orientation="vertical"> <RelativeLayout android:id="@+id/p1" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="p1" android:textSize="48sp" /> </RelativeLayout> </LinearLayout>