Wie kann LinearLayout in der Mitte des übergeordneten Elements ausgerichtet werden?


80

Ich habe hier bei SO zahlreiche ähnliche Fragen durchgesehen, aber nichts hilft. Ich habe eine Hierarchie verschiedener verschachtelter Layouts, die alle haben android:layout_width="fill_parent", und das innerste Layout hat android:layout_width="wrap_content- ich muss es in der Mitte (horizontal) ausrichten. Wie mache ich das?

Update :: Ich habe die Ursache des Problems gefunden. Wenn ich das innere LinearLayout in RelativeLayout mit eingefügt habe android:layout_width="fill_parent", wird der Inhalt trotzdem umbrochen . Die TableRow füllt jedoch wirklich den Bildschirm.

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

Antworten:


229

Diese beiden Attribute werden häufig verwechselt:

  • android:gravity Legt die Schwere des Inhalts der Ansicht fest, für die sie verwendet wird.
  • android:layout_gravityLegt die Schwerkraft der Ansicht oder des Layouts relativ zum übergeordneten Element fest .

Legen Sie also entweder android:gravity="center"das übergeordnete android:layout_gravity="center"Element oder das LinearLayout selbst an.

Ich habe mich mehrmals dabei erwischt, sie zu verwechseln und mich zu fragen, warum die Dinge nicht richtig zentriert waren ...


1
Ich habe versucht, android:layout_gravity="center"für das Layout, das die TextViews enthält - hilft nicht, es ist immer noch links ausgerichtet. Es wurde auch versucht, die Breite dieses Layouts auf wrapund einzustellen fill- kein Unterschied.
Violette Giraffe

1
Haben Sie versucht, das Pixel Perfect-Tool in Eclipse zu verwenden? Es zeigt Ihnen die Grenzen der Layouts in einer Live-Version Ihrer App, sodass Sie im Allgemeinen herausfinden können, wo Sie einen Fehler gemacht haben.
jkschneider

+1 zur Erklärung des verwirrenden Unterschieds zwischen der Verwendung des Schlüsselworts "Schwerkraft" durch das Element und das der Eltern.
Scatmoi

+1 weil es mein Problem löst. Mein Beispiel => Ich habe ein lineares Layout und eine Textansicht darin. Es funktioniert für Texview. Es zentriert den Tw horizontal.
Alicanbatur

Keine layout_gravity für LinearLayout
Sayka

15

Bitte versuchen Sie dies in Ihrem linearen Layout

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

2
Diese Parameter sind für RelativeLayout
Danijax

2
Dies sind keine linearen Layout-Parameter
pcodex

Kann nicht im linearen Layout verwendet werden.
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>

Ziehen Sie in Betracht, relativeLayout über LinearLayout zu verpacken. android:layout_centerHorizontal="true"positioniert die Ansichtsmitte horizontal.


Hab das schon versucht. Es funktioniert nicht! Ich verstehe nicht, was dort vor sich geht ... Ich habe den vollständigen Code meines XML gepostet und nur einige andere Tabellenzeilen gekürzt. Was ist los mit meinem Layout?
Violette Giraffe

Es hat etwas mit Tabellenzeilen zu tun, ich denke, sie fügen die Kinder links hinzu. Geben Sie für das Tabellenzeilen-Tag layout_width = "fill_parent" an.
Yashwanth Kumar

Wenn für das XML-Setup in dieser Antwort immer noch Probleme auftreten, überprüfen Sie erneut LinearLayout, layout_widthwelche sein sollten wrap_contentund welche nicht match_parent. Die gleiche Logik gilt für die vertikale Ausrichtung
Kellogs

5

Hinzufügen layout_gravity="center"oder "center_horizontal"zum übergeordneten Layout.

Nebenbei bemerkt, Ihr LinearLayoutInneres TableRowscheint unnötig zu sein, da a TableRowbereits eine Horizontale ist LinearLayout.


Dies ist erforderlich, da die Tabelle das übergeordnete Element ausfüllen und nur mehrere Zeilen zentriert werden müssen. Und layout_gravity hilft nicht.
Violette Giraffe

3

Versuche dies:

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

Das hat bei mir funktioniert .. leere Ansicht hinzufügen ..

<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

Try <TableRow android:gravity="center_horizontal">Dies zentriert das innere LinearLayout innerhalb des Tablerows.


2

Ich habe die gleiche Situation beim Entwerfen einer benutzerdefinierten Benachrichtigung erlebt. Ich habe versucht, mit dem folgenden Attribut mit true gesetzt.

 android:layout_centerInParent.

2

das hat bei mir funktioniert.

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

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

</LinearLayout>

Sie entwerfen also das lineare Layout so, dass der gesamte Inhalt (Textansicht und Schaltfläche) in der Mitte platziert wird. Anschließend werden die Textansicht und die Schaltfläche relativ zur Mitte des linearen Layouts platziert


1

@jksschneider Erklärung ist fast richtig. Stellen Sie sicher, dass Sie kein gravityübergeordnetes Layout festgelegt haben, und stellen Sie dann layout_gravity="center"Ihre Ansicht oder Ihr Layout ein.


1

Ich habe dies bei der Arbeit mit verschachtelten RelativeLayouts erlebt. Meine Lösung war einfach, aber es ist ein kleines Problem, das es wert ist, beachtet zu werden.

Mein Layout wurde definiert mit ...

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

... aber ich dachte nicht, dass das Layout darunter darüber gelegt wurde. Alles in diesem Layout wurde nach unten verschoben und nicht zentriert. Hinzufügen ...

android:layout_above="@id/bottomLayout"

... mein Problem behoben.


0

Für ImageView oder andere Ansichten, deren Layout-Schwerkraft oder Schwerkraft nicht vorhanden ist, verwenden Sie: android:layout_centerInParent="true"im Kind (ich hatte als Kind ein relatives Layout mit einem ImageView).


0

Das Problem ist, dass die Schwerkraft der Wurzel (das Hauptlayout, in dem Sie die anderen Elemente speichern) nicht festgelegt ist. Wenn Sie es ändern zu zentrieren Schwerkraft die anderen Elemente müssen gut funktionieren.


0

Unten finden Sie Code, mit dem Sie Ihr Linearlayout unten und seinen Inhalt in der Mitte platzieren können. Sie müssen RelativeLayout verwenden, um das Layout unten festzulegen.

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.