Android - wyśrodkuj TextView poziomo w LinearLayout

111

Mam następujący podstawowy układ

<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>

Wygląda na to, że xml jest poprawny, ale tekst jest wyrównany do lewej. Widok tekstu zajmuje całą szerokość elementu nadrzędnego, a widok tekstu jest wyśrodkowany. Nie jestem pewna na czym polega problem...

Jake Wilson
źródło
2
wypróbuj android: gravity = "center" dla swojego
widoku tekstu

Odpowiedzi:

227

Dzieje się tak, ponieważ TextView wypełnia całą szerokość wewnętrznego LinearLayout, jest już w poziomym środku układu . Kiedy android:layout_gravitygo używasz , umieszcza widżet jako całość w określonej grawitacji. Zamiast umieszczać całe centrum widżetów, tak naprawdę próbujesz umieścić zawartość w środku, co można wykonać, android:gravity="center_horizontal"a android:layout_gravityatrybut można usunąć.

Dan S.
źródło
3
Jeśli dobrze rozumiem, mógłby zmienić "android: layout_width =" fill_parent "na" wrap_content ", a następnie użyć android: layout_gravity =" center_horizontal ". Mam rację?
Paul Brewczyński
1
@bluesm Nie, wewnętrzny LinearLayout nie pozwala sobie na miejsce, które nie jest wypełnione View (nie biorąc pod uwagę przypadku pustego LinearLayout). Tak więc android:layout_widthbędą miały tę samą wartość (po układzie). Ponieważ szerokość TextView jest równy z wewnętrznej LinearLayout TextView skutecznie ma android:layout_gravitywartości left, righti centerw tym samym czasie.
Dan S
1
Dla ImageViewITS layout_gravityoraz TextViewjego gravityjest to, co tylko działa. Android jest świetny! Dzięki wszystkim pięknym słupkom SO, bez których rozwój byłby po prostu niemożliwy.
Atul
1
nie zapomnij o android:layout_width="match_parent"
Choletski
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>

JoeLallouz
źródło
24

Jeśli ustawisz <TextView>w środku, <Linearlayout>to najpierw ustaw android:layout_width="fill_parent"obowiązkowe
Nie ma potrzeby używania innej grawitacji

    <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
źródło
16

Użyj android:gravity="center"w TextViewzamiast layout_gravity.

Czarny pas
źródło
Krótka i precyzyjna odpowiedź. Dziękuję
nurnachman
4

Po prostu użyj: android: layout_centerHorizontal = "true"

Spowoduje to umieszczenie całego widoku tekstu w środku

charlenecipres
źródło