Android - центрировать TextView по горизонтали в LinearLayout

111

У меня следующий базовый макет

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/title_bar_background">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:padding="10dp"
        android:text="HELLO WORLD" />

    </LinearLayout>
<LinearLayout>

Кажется, что xml правильный, но текст выровнен по левому краю. Текстовое представление занимает всю ширину родителя, а текстовое представление устанавливается по центру. Не уверен, в чем проблема ...

Джейк Уилсон
источник
2
попробуйте android: gravity = "center" для вашего текстового представления
user370305 04

Ответы:

227

Происходит то, что поскольку TextView заполняет всю ширину внутреннего LinearLayout, он уже находится в центре горизонтального макета . При использовании android:layout_gravityон помещает виджет в целом в заданную силу тяжести. Вместо того, чтобы размещать весь центр виджетов, вы на самом деле пытаетесь разместить контент в центре, что может быть выполнено с помощью, android:gravity="center_horizontal"а android:layout_gravityатрибут может быть удален.

Дэн С
источник
3
Если я правильно понимаю, он мог изменить "android: layout_width =" fill_parent "на" wrap_content ", а затем использовать android: layout_gravity =" center_horizontal ". Я прав?
Пол Брючински
1
@bluesm Нет, внутренний LinearLayout не позволяет себе иметь пространство, которое не заполнено View (не считая случая пустого LinearLayout). Таким образом, android:layout_widthбудет иметь то же значение (после макета). Так как ширина TextView равна с внутренней LinearLayout TextView эффективно имеет android:layout_gravityзначение left, rightи centerв то же самое время.
Дэн С.
1
Для ImageViewнего layout_gravityи для TextViewнего gravity- то, что только работает. Андроид отличный! Спасибо всем красивым SO сообщениям, без которых развитие было просто невозможно.
Атул
1
не забывайте про android:layout_width="match_parent"
Холецкий 03
24
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bar_background">

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:padding="10dp"
    android:text="HELLO WORLD" />

</LinearLayout>

Джо Лаллуз
источник
24

Если вы установите <TextView>по центру, <Linearlayout>то сначала установите android:layout_width="fill_parent"обязательное
Нет необходимости использовать какую-либо другую гравитацию

    <LinearLayout
            android:layout_toRightOf="@+id/linear_profile" 
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:orientation="vertical"
            android:gravity="center_horizontal">
            <TextView 
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:text="It's.hhhhhhhh...."
                android:textColor="@color/Black"

                />
    </LinearLayout>
Patel135
источник
16

Использование android:gravity="center"в TextViewвместо layout_gravity.

Черный пояс
источник
Краткий и точный ответ. Спасибо
nurnachman
4

Просто используйте: android: layout_centerHorizontal = "true"

Это поместит все текстовое изображение в центр

шарленепрес
источник