在Android中垂直居中视图

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

 <?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" > <EditText android:text="example text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> </LinearLayout> 

但是它不起作用。 EditText仍然在屏幕的顶部。 有人能解释我在这里做错了吗?

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

更新:使用android:gravity="center_vertical"上的父母工作。 我仍然不明白为什么android:layout_gravity="center_vertical"的孩子没有工作。

我跟踪Google群组的答案, 在这里它是 ©Romain Guy:

那么,首先RelativeLayout忽略layout_gravity。 那么你需要知道重力的意思是“把重力应用到这个视图的内容”,而layout_gravity意思是“在它的父母面前对这个视图施加重力”。 因此,在TextView中,重力会将文本alignment到TextView边界内,而layout_gravity会将TextView与其父边界alignment。

简单而快速的答案是将android:gravity="center_vertical"到父视图(包含)。 对于那些想知道为什么,请参阅@Bostone的答案。

有三种方法可以垂直居中视图。 我build议现在使用ConstraintLayout。

1.水平LinearLayout

关键是方向=“水平”。 您不能水平居中方向=“垂直”。

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="example text"/> </LinearLayout> 

2. RelativeLayout

有了RelativeLayout,你可以使用layout_centerVertical="true"

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text="example text"/> </RelativeLayout> 

3. ConstraintLayout

向你展示这个最简单。

在这里输入图像说明

这是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_width="match_parent" android:layout_height="match_parent" tools:context="com.example.constraintlayout.MainActivity" tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="81dp"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" 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>