layout_gravity кнопки в LinearLayout работает неправильно

Мое требование - добиться этого в LinearLayout. Он имеет только один дочерний вид. В горизонтальной ориентации кнопка должна быть в центре горизонтали, если установлен layout_gravity. мой макет xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="200dp"
android:background="#ffff00"
android:layout_width="match_parent"
android:orientation="horizontal">

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Button" />

</LinearLayout>

Но результат такой, как на картинке ниже

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

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


person AndEngine    schedule 15.07.2014    source источник
comment
android:layout_gravity=center использовать только центр и вертикальную ориентацию   -  person Brendon    schedule 15.07.2014
comment
@ Брендон, можете ли вы опубликовать ссылку на документацию, описывающую это поведение?   -  person Blackbelt    schedule 15.07.2014


Ответы (5)


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

добавьте следующий атрибут в LinearLayout

android:gravity="center_horizontal"
person K3V    schedule 15.07.2014

Вы можете достичь этого двумя способами:

Установите android:gravity="center_horizontal" в свойствах макета.

or

Установите android:layout_gravity="center" в свойствах кнопки.

Ваш макет должен быть в «вертикальной» ориентации

person Brendon    schedule 15.07.2014

Нам нужно разобраться в вопросе:

  • Виджет может использовать только вертикальный атрибут (например, top, center_vertical, bottom), если его корневой макет используетorientation: horizontal
  • Виджет может использовать только горизонтальный атрибут (например, left, center_horizontal, right), если его корневой макет использует orientation: vertical

Так что вам нужно сделать так (проверено и работает):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="200dp"
    android:background="#ffff00"
    android:layout_width="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Button" />

</LinearLayout>

Тестовое изображение

person rosuh    schedule 19.08.2017

Установите центр горизонтальной гравитации на родителя:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="200dp"
    android:background="#ffff00"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:gravity="center_horizontal">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

или просто измените родительскую ориентацию на horizontal

person Eldar Miensutov    schedule 15.07.2014
comment
любой другой способ добиться этого на дочернем уровне. - person AndEngine; 15.07.2014

На самом деле вы не можете. Ваш корневой макет имеет горизонтальную ориентациюL android:orientation="horizontal". Если вы хотите, чтобы это работало, просто измените ориентацию корня на vertical (я еще не проверял!)

person Kingfisher Phuoc    schedule 15.07.2014