Як вирівняти LinearLayout по центру батьківського елемента?


80

Я переглядав численні подібні запитання тут на 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>

Відповіді:


230

Ці два атрибути зазвичай плутають:

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

Тож надіньте android:gravity="center"на батьківський або android:layout_gravity="center"на сам LinearLayout.

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


1
Я спробував android:layout_gravity="center"макет, який містить TextViews - не допомагає, він все ще вирівняний ліворуч. Також спробував встановити ширину цього макета на wrapта fill- ніякої різниці.
Violet Giraffe

1
Ви пробували використовувати інструмент Pixel Perfect в Eclipse? Він показує вам межі макетів у поточній версії вашого додатка, тому ви можете загалом зрозуміти, де ви помилилися.
jkschneider

+1 для пояснення заплутаної різниці між використанням елементом та батьком ключового слова "сила тяжіння".
scatmoi

+1 coz це вирішить мою проблему. Мій приклад => У мене є лінійний макет та текстовий перегляд. Це працює для texview. Він центрирує tw по горизонталі.
аліканбатур

Жодної layout_gravity для LinearLayout
Sayka

15

Спробуйте це у своєму лінійному макеті

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"

2
ці параметри для RelativeLayout
danijax

2
Це не параметри Linear Layout
pcodex,

Не можна використовувати це в лінійному макеті.
Крістофер Сміт,

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>

розглянемо обтікання relativeLayout поверх LinearLayout. android:layout_centerHorizontal="true"розмістить центр огляду горизонтально.


Вже спробував це. Це не працює! Я не розумію, що там відбувається ... Я опублікував повний код свого XML, я обрізав лише деякі інші рядки таблиці. Що поганого в моєму макеті?
Violet Giraffe

я думаю, це пов’язано з рядками таблиць, вони додають дітей ліворуч. подумайте про надання layout_width = "fill_parent" для тегу рядка таблиці.
Яшвант Кумар,

для налаштування xml у цій відповіді, якщо все ще виникають проблеми, перевірте ще раз те LinearLayout, layout_widthщо повинно бути, wrap_contentа ні match_parent.
Така

5

додати layout_gravity="center"або "center_horizontal"до батьківського макета.

На бічній записці, ваша LinearLayoutвнутрішня частина TableRowздається вам непотрібною, оскільки а TableRow- це вже горизонталь LinearLayout.


Це необхідно, тому що мені потрібна таблиця, щоб заповнити батьківську, і лише кілька рядків для центрування. І layout_gravity не допомагає.
Violet Giraffe

3

Спробуйте це:

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

3

Це спрацювало для мене .. додавання порожнього перегляду ..

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

2

Спробуйте <TableRow android:gravity="center_horizontal">Це відцентрує внутрішній LinearLayout усередині таблиці.


2

Я стикався з такою ж ситуацією, розробляючи спеціальне сповіщення. Я пробував із наступним набором атрибутів з true.

 android:layout_centerInParent.

2

це спрацювало для мене.

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

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

</LinearLayout>

отже, ви розробляєте Лінійний макет, щоб розмістити весь його вміст (TextView та Button) у його центрі, а потім TextView та Button розміщуються відносно центру Лінійного макета


1

Пояснення @jksschneider майже правильно. Переконайтеся, що ви не встановили gravityбатьківський макет, а потім встановіть layout_gravity="center"свій вид або макет.


1

Я відчув це під час роботи з вкладеними RelativeLayouts. Моє рішення виявилося простим, але це невеличка проблема, про яку варто знати.

Мій макет був визначений за допомогою ...

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

... однак, я не думав, що макет під цим розміщений поверх нього. Все, що було всередині цього макета, було зміщено донизу, а не по центру. Додавання ...

android:layout_above="@id/bottomLayout"

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


0

для ImageView та інших поглядів, у яких компонент гравітація чи гравітація не існує, використовуються: android:layout_centerInParent="true"у дочірній організації (у мене в дитинстві був відносний макет із ImageView).


0

Проблема в тому, що сила тяжіння кореня (основний макет, в якому ви зберігаєте інші елементи) не встановлена. Якщо ви зміните його на центр тяжіння інших елементів, він повинен працювати нормально.


0

Нижче наведено код для розміщення Linearlayout внизу та розміщення його вмісту в центрі. Вам потрібно використовувати RelativeLayout, щоб встановити Layout внизу.

<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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.