如何在其父级的中心对齐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>

Answers:


229

这两个属性通常是混淆的:

  • android:gravity 设置其使用的视图内容的重力。
  • android:layout_gravity设置视图或布局相对于其父项的重力。

因此,要么放在android:gravity="center"父对象android:layout_gravity="center"上,要么放在LinearLayout本身上。

我已经迷住了很多次,不知道为什么事情不能正确地居中...


1
我已经尝试过android:layout_gravity="center"包含TextViews的布局-无济于事,它仍然向左对齐。还尝试将此布局的宽度设置为wrapfill-没有差异。
紫罗兰色长颈鹿

1
您是否尝试过在Eclipse中使用Pixel Perfect工具?它会向您显示应用程序实时版本的版式上的边框,因此您通常可以弄清楚哪里出了问题。
jkschneider 2011年

+1,用于解释元素和父级对关键字“重力”的使用之间的混淆性区别。
scatmoi

+1因为它解决了我的问题。我的示例=>我有一个线性布局,并且其中有一个textview。它适用于texview。它使tw水平居中。
alicanbatur

LinearLayout没有layout_gravity
2014年

15

请在您的线性布局中尝试

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

2
这些参数用于RelativeLayout
danijax

2
这些都不是线性布局PARAMS
pcodex

不能在线性布局中使用它。
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>

考虑将relativeLayout包装在LinearLayout上。android:layout_centerHorizontal="true"将视图中心水平放置。


已经尝试过了。它不起作用!我不明白那里发生了什么...我已经发布了XML的完整代码,只整理了一些其他表行。我的布局有什么问题?
紫罗兰色长颈鹿

我认为这与表行有关,它们将子级添加到左侧。考虑为表格行标记提供layout_width =“ fill_parent”。
Yashwanth Kumar

对于此答案中的xml设置,如果仍然有问题,请再次检查LinearLayoutlayout_width,应该是,wrap_content而不是match_parent。同样的逻辑适用于垂直对齐
kellogs 2013年

5

添加layout_gravity="center"或添加"center_horizontal"到父版式。

顺便提一句,您的LinearLayout内部TableRow似乎不必要,因为aTableRow已经是水平的LinearLayout


这是必需的,因为我需要用表来填充父级,并且只将几行置于中心。而layout_gravity并没有帮助。
紫罗兰色长颈鹿

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

这对我有用。

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

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

</LinearLayout>

因此,您正在设计线性布局以将其所有内容(TextView和Button)放置在其中心,然后将TextView和Button相对于Linear Layout的中心放置


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

下面的代码将您的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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.