Jak wyrównać LinearLayout na środku jego elementu nadrzędnego?

80

Przejrzałem wiele podobnych pytań tutaj, w SO, ale nic nie pomaga. Mam hierarchię różnych układów zagnieżdżonych, wszystkie mają android:layout_width="fill_parent", a układ najbardziej wewnętrzny ma android:layout_width="wrap_content- muszę wyrównać go na środku (w poziomie). Jak mogę to zrobić?

Aktualizacja:: Znalazłem przyczynę problemu - jeśli wstawię wewnętrzny LinearLayout do RelativeLayout za pomocą android:layout_width="fill_parent", nadal zawija on swoją zawartość. Jednak TableRow naprawdę wypełnia ekran.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
        <TableLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
            <TableRow >
            <LinearLayout 
            android:orientation="horizontal"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">
                    <TextView
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:text="1"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

                     <TextView
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:text="2"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
             </LinearLayout>
           </TableRow>
        </TableLayout>
    </FrameLayout>
</LinearLayout>
Fioletowa żyrafa
źródło

Odpowiedzi:

231

Te dwa atrybuty są często mylone:

  • android:gravity ustawia wagę zawartości widoku, w którym jest używana.
  • android:layout_gravityustawia wagę Widoku lub Układu względem jego rodzica .

Więc albo włóż android:gravity="center" na rodzicu, albo android:layout_gravity="center"na samym LinearLayout.

Wiele razy łapałem się na tym, że mieszam je i zastanawiam się, dlaczego rzeczy nie są właściwie wyśrodkowane ...

jkschneider
źródło
1
Próbowałem android:layout_gravity="center"dla układu zawierającego TextViews - nie pomaga, nadal jest wyrównany do lewej. Próbowałem także ustawić szerokość tego układu na wrapi fill- bez różnicy.
Violet Giraffe
1
Czy próbowałeś użyć narzędzia Pixel Perfect w Eclipse? Pokazuje granice układów w aktywnej wersji Twojej aplikacji, dzięki czemu możesz ogólnie określić, gdzie popełniłeś błąd.
jkschneider
+1 za wyjaśnienie mylącej różnicy między użyciem słowa kluczowego „grawitacja” przez element i rodzica.
scatmoi
+1, bo to rozwiązuje mój problem. Mój przykład => Mam układ liniowy i widok tekstu. Działa w przypadku texview. Centruje tw w poziomie.
alicanbatur
Brak layout_gravity dla LinearLayout
Sayka
15

Spróbuj tego w swoim układzie liniowym

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
Lakshmanan
źródło
2
te parametry są dla RelativeLayout
danijax
2
To nie są parametry układu liniowego
pcodex
Nie można tego użyć w układzie liniowym.
Christopher Smit
10
<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <LinearLayout 
            android:orientation="horizontal"
            android:layout_centerHorizontal="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
                 android:text="1"
                 android:textAppearance="?android:attr/textAppearanceLarge" />

           <TextView
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
                 android:text="2"
                 android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>
</RelativeLayout>

rozważ zawijanie względnegoLayout do LinearLayout. android:layout_centerHorizontal="true"ustawi środek widoku w poziomie.

Yashwanth Kumar
źródło
Już tego próbowałem. To nie działa! Nie rozumiem, co się tam dzieje… Opublikowałem pełny kod mojego XML-a, usunąłem tylko kilka innych wierszy tabeli. Co jest nie tak z moim układem?
Violet Giraffe
Myślę, że ma to coś wspólnego z wierszami tabeli, dodają one dzieci po lewej stronie. rozważ podanie layout_width = "fill_parent" dla tagu wiersza tabeli.
Yashwanth Kumar
dla konfiguracji xml w tej odpowiedzi, jeśli nadal masz problemy, sprawdź ponownie LinearLayout, layout_widthktóre powinny być, wrap_contenta które nie match_parent. Ta sama logika dotyczy wyrównywania w pionie
kellogs
5

dodać layout_gravity="center"lub "center_horizontal"do układu nadrzędnego.

Na marginesie, twoje LinearLayoutwnętrze TableRowwydaje się niepotrzebne, ponieważ a TableRowjest już poziome LinearLayout.

Emmanuel Sys
źródło
Jest to konieczne, ponieważ potrzebuję tabeli do wypełnienia rodzica i tylko kilku wierszy do wyśrodkowania. A layout_gravity nie pomaga.
Violet Giraffe
3

Spróbuj tego:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
        <TableLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
            <TableRow >
            <LinearLayout 
            android:orientation="horizontal"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:gravity="center_horizontal" 
                    android:layout_gravity="center_horizontal" >
                    <TextView
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:text="1"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

                     <TextView
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:text="2"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
             </LinearLayout>
           </TableRow>
        </TableLayout>
    </FrameLayout>
</LinearLayout>
Hiral Vadodaria
źródło
3

To zadziałało dla mnie .. dodanie pustego widoku ..

<LinearLayout
       android:layout_width="match_parent"
        android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
        android:orientation="horizontal"
         >
<View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1"
            />  
     <com.google.android.gms.ads.AdView

         android:id="@+id/adView"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"

         android:layout_gravity="center_horizontal"
         ads:adSize="BANNER"
         ads:adUnitId="@string/banner_ad_unit_id" >

    </com.google.android.gms.ads.AdView>
    <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1"
            />  
    </LinearLayout>
gitesh devhane
źródło
2

Wypróbuj <TableRow android:gravity="center_horizontal">Spowoduje to wyśrodkowanie wewnętrznego układu LinearLayout w tabeli.

triggs
źródło
2

Z taką samą sytuacją spotkałem się podczas projektowania niestandardowego powiadomienia. Próbowałem z następującym atrybutem ustawionym na true.

 android:layout_centerInParent.
Karthikeyan Ve
źródło
2

to działało dla mnie.

<LinearLayout>
.
.
.
android:gravity="center"
.
.>

<TextView
android:layout_gravity = "center"
/>
<Button
android:layout_gravity="center"
/>

</LinearLayout>

więc projektujesz układ liniowy, aby umieścić całą jego zawartość (TextView i przycisk) w jego środku, a następnie TextView i przycisk są umieszczane względem środka układu liniowego

pcodex
źródło
1

Wyjaśnienie @jksschneider jest prawie właściwe. Upewnij się, że nie ustawiłeś żadnego gravityna układ nadrzędny, a następnie ustaw layout_gravity="center"na swój widok lub układ.

Pawan
źródło
1

Doświadczyłem tego podczas pracy z zagnieżdżonymi układami RelativeLayouts. Moje rozwiązanie okazało się proste, ale warto o tym pamiętać.

Mój układ został zdefiniowany za pomocą ...

android:layout_height="fill_parent"
android:layout_below="@id/someLayout
android:gravity="center"

... jednak nie sądziłem, że układ poniżej tego jest umieszczony na nim. Wszystko w tym układzie zostało przesunięte w dół zamiast do środka. Dodawanie ...

android:layout_above="@id/bottomLayout"

... naprawił mój problem.

Crash5998
źródło
0

dla ImageView lub innych widoków, których układ-grawitacja lub grawitacja nie istnieje, użyj: android:layout_centerInParent="true"w dziecku (miałem układ względny z ImageView jako dziecko).

bastami82
źródło
0

Problem polega na tym, że grawitacja roota (główny układ, w którym przechowujesz inne elementy) nie jest ustawiona. Jeśli zmienisz to w celu wyśrodkowania , grawitacja pozostałych elementów musi działać dobrze.

Marin Karadzhov
źródło
0

Poniżej znajduje się kod, aby umieścić układ liniowy na dole i umieścić jego zawartość w centrum. Musisz użyć RelativeLayout, aby ustawić układ na dole.

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

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#97611F"
    android:gravity="center_horizontal"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text="View Saved Searches"
        android:textSize="15dp"
        android:textColor="#fff"
        android:gravity="center_vertical"
        android:visibility="visible" />
    <TextView
        android:layout_width="30dp"
        android:layout_height="24dp"
        android:text="12"
        android:textSize="12dp"
        android:textColor="#fff"
        android:gravity="center_horizontal"
        android:padding="1dp"
        android:visibility="visible" />
  </LinearLayout>  
</RelativeLayout>
Kalpesh Patil
źródło