#android #gravity #layout-gravity
#Android #гравитация #макет-гравитация
Вопрос:
У меня есть TextView в LinearLayout.
Я хочу попробовать разные режимы для layout_gravity и gravity.
У меня есть этот код:
<LinearLayout
android:layout_width="150dp"
android:layout_height="50dp"
android:background="#A55C93"
android:orientation="horizontal">
<TextView
android:id="@ id/textView1"
android:background="#005Cff"
android:layout_gravity="center"
android:gravity="center"
android:layout_width="50dp"
android:layout_height="25dp"
android:text="text"
android:textSize="21sp" />
</LinearLayout>
Когда у меня есть android:orientation="vertical"
, все о layout_gravity
и gravity
имеет смысл. Но когда у меня есть android:orientation="horizontal"
, результаты отличаются от первого, почему?
Ответ №1:
Главное, что нужно понять, это то, что layout_gravity
в дочернем представлении есть атрибут, который связывается «до» с родителем и «просит» родителя вести себя определенным образом.
В этом случае родительским является a LinearLayout
, который имеет другой атрибут ( orientation
), который уже влияет на расположение дочерних представлений. Поэтому, когда дочерний элемент указывает layout_gravity
, то, что происходит, зависит от LinearLayout
‘s orientation
.
- Для
horizontal
LinearLayout любой горизонтальный компонент дочернегоlayout_gravity
элемента игнорируется. - Для
vertical
LinearLayout любой вертикальный компонент дочернегоlayout_gravity
элемента игнорируется.
Вы используете center
, что в основном означает center_vertical
center_horizontal
. Таким образом, для горизонтального LinearLayout горизонтальное центрирование будет проигнорировано. И для вертикального LinearLayout вертикальное центрирование будет проигнорировано.
Учитывая, что в вашем примере есть только одно дочернее представление, вы могли бы рассмотреть возможность замены родительского LinearLayout
на FrameLayout
. Тогда ребенок layout_gravity
будет полностью уважаем.
Ответ №2:
попробуйте этот код, и вы увидите разницу увеличьте высоту макета, чтобы увидеть разницу; это поможет вам лучше понять поток
когда вы устанавливаете центр тяжести в горизонтальную линейную компоновку, центр не относится к горизонтальному центру, он относится к центру по вертикали.
я знаю, это звучит запутанно, но попробуйте этот код, и у вас будет лучшее представление о том, что я пытаюсь сказать.
<LinearLayout
android:layout_width="150dp"
android:layout_height="500dp"
android:background="#A55C93"
android:orientation="horizontal"
>
<TextView
android:id="@ id/textView1"
android:background="#005Cff"
android:layout_gravity="center"
android:layout_width="50dp"
android:layout_height="25dp"
android:text="text"
android:textSize="21sp"
/>
</LinearLayout>
также попробуйте это с вертикальной
<LinearLayout
android:layout_width="150dp"
android:layout_height="500dp"
android:background="#A55C93"
android:orientation="vertical"
tools:ignore="MissingConstraints"
>
<TextView
android:id="@ id/textView1"
android:background="#005Cff"
android:layout_gravity="center"
android:layout_width="50dp"
android:layout_height="25dp"
android:text="text"
android:textSize="21sp"
/>
</LinearLayout>
попробуйте добавить несколько представлений к макету, и это поможет вам получить точное представление.
другими словами, в горизонтально ориентированном линейном макете, если вы установите центр тяжести макета, ваш вид будет выровнен по центру высоты линейного макета, а если вы установите центр тяжести макета на вертикально выровненный линейный макет, он выровняет центр вашего вида по ширине линейного макета