在Android中垂直居中视图

Posted

技术标签:

【中文标题】在Android中垂直居中视图【英文标题】:Vertically centering a view in Android 【发布时间】:2010-12-13 05:15:02 【问题描述】:

我正在尝试使用以下布局在屏幕上垂直居中 View

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_
    android:layout_ >
    <EditText 
        android:text="example text"  
        android:layout_ 
        android:layout_
        android:layout_gravity="center_vertical" />
</LinearLayout>

但是它不起作用。 EditText 仍位于屏幕顶部。有人可以解释我在这里做错了什么吗?

注意:如果我将center_horizontal 添加到layout_gravity 属性,则它会水平居中,但仍不会垂直居中。

更新: 在父级上使用 android:gravity="center_vertical" 有效。我还是不明白为什么android:layout_gravity="center_vertical" 对孩子不起作用。

【问题讨论】:

我遇到了这个问题,就像你在更新中所说的那样。我到处寻找,但没有答案。你知道了吗?根据定义,layout_gravity 应该做我们想做的事,但它不起作用 【参考方案1】:

我在 Google 群组中跟踪答案,here it is © Romain Guy:

首先,RelativeLayout 忽略了 layout_gravity。然后你需要知道重力意味着“将重力应用到这个视图的内容”,而 layout_gravity 的意思是“应用重力到它的父视图中的这个视图”。因此在 TextView 上,重力会将文本对齐到 TextView 的边界内,而 layout_gravity 会将 TextView 对齐到其父级的边界内。

【讨论】:

这似乎与我上面所说的没有冲突(尤其是在“更新”中),但它不能正常工作。 如何解决上述问题? OP 根本没有使用 RelativeLayout,它没有回答为什么它不起作用。 同意上面的评论,这个不应该选答案 这是一个不错的答案,因为它提供了在父节点上设置重力以实现相同结果的替代方法。它确实帮助了我。 更明显的答案是:将 android:gravity="center_vertical" 添加到父(包含)视图【参考方案2】:

您可以通过三种方式将视图垂直居中。我建议现在使用 ConstraintLayout。

1。水平线性布局

关键是orientation="horizo​​ntal"。对于orientation="vertical",您不能水平居中。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal">

    <EditText
        android:layout_
        android:layout_
        android:layout_gravity="center_vertical"
        android:text="example text"/>

</LinearLayout>

2。相对布局

使用RelativeLayout,您可以使用layout_centerVertical="true"

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <EditText
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:text="example text"/>

</RelativeLayout> 

3。约束布局

给你看这个是最简单的。

这里是 XML。它仍然需要添加一个水平约束。

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context="com.example.constraintlayout.MainActivity"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="81dp">

    <EditText
        android:layout_
        android:layout_
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:text="example text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="16dp"/>

</android.support.constraint.ConstraintLayout>

【讨论】:

【参考方案3】:

简单快速的答案是将android:gravity="center_vertical" 添加到父(包含)视图。想知道原因的可以参考@Bostone 的回答。

【讨论】:

以上是关于在Android中垂直居中视图的主要内容,如果未能解决你的问题,请参考以下文章

ImageView android:scaleType,放大,垂直居中,左对齐?

在其他两个之间垂直居中视图

在视图控制器中垂直居中并在 swift 中使用导航栏?

如何在Objective C的表视图中垂直居中表视图

限制在超级视图中水平和垂直居中阻止我更改框架

在其线性布局垂直父Android中将以编程方式创建的单选按钮居中