Как выровнять LinearLayout в центре его родителя? - PullRequest
71 голосов
/ 18 ноября 2011

Я просмотрел множество подобных вопросов здесь, в SO, но ничего не помогает. У меня есть иерархия различных вложенных макетов, у всех есть android:layout_width="fill_parent", а у самого внутреннего макета есть android:layout_width="wrap_content - мне нужно выровнять его по центру (по горизонтали). Как мне это сделать?

Обновление: : Я нашел причину проблемы - если я помещаю внутренний LinearLayout в RelativeLayout с android:layout_width="fill_parent", он все равно оборачивает его содержимое. Однако TableRow действительно заполняет экран.

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

Ответы [ 14 ]

207 голосов
/ 18 ноября 2011

Эти два атрибута обычно путают:

  • android:gravity устанавливает серьезность содержимого представления, в котором он используется.
  • android:layout_gravity устанавливает гравитацию вида или макета относительно его родителя .

Так что либо положите android:gravity="center" на родителя, либо android:layout_gravity="center"на самой LinearLayout.

Я несколько раз ловил себя на том, что смешиваю их и удивляюсь, почему вещи не центрированы должным образом ...

16 голосов
/ 21 января 2013

Пожалуйста, попробуйте это в вашем линейном макете

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
10 голосов
/ 18 ноября 2011
<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>

рассмотрим перенос относительнойLayout на LinearLayout.android:layout_centerHorizontal="true" поместит центр обзора в горизонтальное положение.

5 голосов
/ 18 ноября 2011

добавьте layout_gravity="center" или "center_horizontal" к родительской раскладке.

На заметке со стороны ваш LinearLayout внутри вашего TableRow кажется ненужным, поскольку TableRow уже является горизонтальнымLinearLayout.

3 голосов
/ 28 ноября 2015

Это сработало для меня .. добавив пустое представление ..

<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>
3 голосов
/ 18 ноября 2011

Попробуйте это:

<?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>
2 голосов
/ 18 сентября 2014

Я столкнулся с такой же ситуацией при разработке пользовательских уведомлений. Я попытался со следующим атрибутом, установленным с истиной.

 android:layout_centerInParent.
2 голосов
/ 18 ноября 2011

Попробуйте <TableRow android:gravity="center_horizontal"> Это будет центрировать внутренний LinearLayout в таблице.

1 голос
/ 24 мая 2019

Я испытал это, работая с вложенными RelativeLayouts.Мое решение оказалось простым, но о нем стоит знать.

Мой макет был определен с ...

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

... однако я этого не сделалдумаю, что макет ниже этого был помещен сверху этого.Все внутри этого макета было смещено вниз, а не по центру.Добавление ...

android:layout_above="@id/bottomLayout"

... исправило мою проблему.

1 голос
/ 17 марта 2018

это сработало для меня.

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

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

</LinearLayout>

, поэтому вы проектируете линейный макет, чтобы поместить все его содержимое (TextView и Button) в его центр, а затем TextView и Button располагаются относительно центра.линейного расположения

...