在线性布局中使按钮居中

361

我正在使用线性布局(linear layout)显示一个很简单的初始屏幕。它有1个按钮,应该在水平和垂直方向上都居中。但是无论我尝试什么,按钮都会顶部对齐中心。下面是XML代码,有谁能指导我正确的方向吗?

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageButton android:id="@+id/btnFindMe" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:background="@drawable/findme"></ImageButton>

</LinearLayout>

6
在一个水平对齐的LinearLayout中,让我解决问题的方法是将“layout_width”设置为“wrap_content”。随后,layout_gravity实现了它应该做的事情! - Someone Somewhere
1
如果你一定要使用LinearLayout,我认为这个方法可以解决问题:https://dev59.com/pWMl5IYBdhLWcg3w3aPj - Antonio
21个回答

466

使用 LinearLayout 居中:

<LinearLayout
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageButton
        android:id="@+id/btnFindMe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/findme" />
</LinearLayout>

12
相比RelativeLayout来说,LinearLayout更加简单轻量级,应该会稍微快一些。 - SurlyDre
3
我之前使用了layout_gravity而不是gravity。更改为android:gravity="center"解决了这个问题,这是一个初学者的错误。 - ackushiw
@ackushiw 也是我的问题! - Denny
至少对我来说,android:gravity="center" LinearLayout属性解决了问题。谢谢兄弟! - tthreetorch

392

如果你想要将一个项目居中在屏幕中间,不要使用LinearLayout,因为它们是用于在一行中显示多个项目的。

取而代之应该使用RelativeLayout

因此请替换为:

android:layout_gravity="center_vertical|center_horizontal"

对于相关的RelativeLayout选项:

android:layout_centerInParent="true"

那么你的布局文件将会如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/RelativeLayout01" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageButton android:id="@+id/btnFindMe" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@drawable/findme"></ImageButton>

</RelativeLayout>

48
有时需要使用 LinearLayout 来居中内容,但这并不应该成为默认做法。更好的做法是建议使用 RelativeLayout(如果可行),否则说明如何在 LinearLayout 中进行居中操作。 - stevebot
1
更不用说RelativeLayout由于它们的尺寸测量方式而导致运行时更加密集,而LinearLayout非常简单直接且更加高效。 - Trevor Hart

47
您尝试过在布局中定义android:gravity="center_vertical|center_horizontal",并在图像中设置android:layout_weight="1"吗?

2
我喜欢这个选项,它让我保持我的LinearLayout!(虽然我没有在按钮中设置android:weight="1"来居中它。) - Sébastien
4
在水平的LinearLayout中,android:gravity对我没有作用,但是android:layout_gravity有效。 - jfritz42

37

常用于线性布局的方法是在图像按钮上设置一个属性。

android:layout_gravity="center"

您可以选择为线性布局中的每个对象左对齐、居中对齐或右对齐。请注意,上述行与以下行完全相同:

android:layout_gravity="center_vertical|center_horizontal"

4
在包含按钮(子组件)的父布局中添加android:gravity="center"属性。 - Shekh Akther
你还需要在父元素中添加android.orientation="vertical"和layout_gravity属性,即LinearLayout元素... - Joe Healy

12
加上这个。
android:gravity="center"

在LinearLayout中。


2
应该是 android:gravity="center" - John Joe

10

如果您使用 LinearLayout,可以添加重力居中:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center">
            <Button
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            />
</LinearLayout>`

7

使用这个非常简单

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:visibility="visible" 
        android:gravity="center"
        android:orientation="vertical" >

        <ProgressBar
            android:id="@+id/pbEndTrip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center"
            android:text="Gettings" />
    </LinearLayout>

5
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageButton android:id="@+id/btnFindMe" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"
        android:layout_gravity = "center"
        android:background="@drawable/findme">
    </ImageButton>

</LinearLayout>

以上代码将起作用。

5
你可以使用RelativeLayout

3
根据Android文档中关于android:layout_gravity 的XML属性说明,我们可以轻松实现:)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageButton android:id="@+id/btnFindMe" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"

        android:layout_gravity="center"

        android:background="@drawable/findme"></ImageButton>

</LinearLayout>

1
android:layout_gravity="center" 运行良好 :) 谢谢! - Amine Soumiaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接