相对布局重心未正确对齐

relative layout gravity center not aligning correctly

我正试图将我的相对布局的子元素置于屏幕中央,但它的表现就像它与父元素的顶部对齐,我不明白为什么。

我的.XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:background="#f70909">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView2"
        android:adjustViewBounds="true"
        android:src="@drawable/dice"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textMessage"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/imageView2" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editUserSplash"
        android:hint="Username"
        android:gravity="center"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/textMessage" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editPasswordSplash"
        android:hint="Password"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:layout_below="@+id/editUserSplash" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Login"
        android:id="@+id/btnSplash"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/editPasswordSplash" />

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/prgSplash"
        style="@android:style/Widget.DeviceDefault.ProgressBar.Large"
        android:layout_centerHorizontal="true"
        android:indeterminate="true"
        android:layout_below="@+id/btnSplash" />

</RelativeLayout>

我试过将父级设置为 relativelayout 但没有成功,而且它也不会与底部对齐。最初我认为布局没有填满整个屏幕,但由于它的高度和宽度是 match_parent,我认为这不是问题所在。在 android studio 中它显示正确,所以我一定是遗漏了一些小东西。

我也尝试使用 gravitylayoutgravity 参数以及两者的组合但没有成功

编辑:我需要视图彼此保持相同的排列,但在屏幕上垂直居中。

编辑 2:I 将 RelativeLayout 的背景设置为红色并得到: 所以相对布局没有填满我的屏幕。

编辑 3: 编辑 4:

尝试这样的事情。

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


      <ImageView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:id="@+id/imageView2"
          android:adjustViewBounds="true"
          android:layout_centerInParent="true"/>

  <LinearLayout 
      android:orientation="vertical"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:gravity="center"
      android:layout_centerInParent="true">

      <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:textAppearance="?android:attr/textAppearanceMedium"
          android:id="@+id/textMessage" />

      <EditText
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:id="@+id/editUserSplash"
          android:hint="Username"
          android:gravity="center" />

      <EditText
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:id="@+id/editPasswordSplash"
          android:hint="Password"
          android:gravity="center" />

      <Button
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Login"
          android:id="@+id/btnSplash" />

      <ProgressBar
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:id="@+id/prgSplash"
          style="@android:style/Widget.DeviceDefault.ProgressBar.Large"
          android:indeterminate="true" />

  </LinearLayout>

</RelativeLayout>

更新:

如果在 AlertDialog 中设置 xml,则可能会在底部分配 space。我 google 找到这个 alert_dialog.xml 以供参考。底部好像有一个buttonPanel,最小高度为54dip

<LinearLayout android:id="@+id/buttonPanel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="54dip"
    android:orientation="vertical" >
    <LinearLayout
        style="?android:attr/buttonBarStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingTop="4dip"
        android:paddingStart="2dip"
        android:paddingEnd="2dip"
        android:measureWithLargestChild="true">
        <LinearLayout android:id="@+id/leftSpacer"
            android:layout_weight="0.25"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:visibility="gone" />
        <Button android:id="@+id/button1"
            android:layout_width="0dip"
            android:layout_gravity="start"
            android:layout_weight="1"
            style="?android:attr/buttonBarButtonStyle"
            android:maxLines="2"
            android:layout_height="wrap_content" />
        <Button android:id="@+id/button3"
            android:layout_width="0dip"
            android:layout_gravity="center_horizontal"
            android:layout_weight="1"
            style="?android:attr/buttonBarButtonStyle"
            android:maxLines="2"
            android:layout_height="wrap_content" />
        <Button android:id="@+id/button2"
            android:layout_width="0dip"
            android:layout_gravity="end"
            android:layout_weight="1"
            style="?android:attr/buttonBarButtonStyle"
            android:maxLines="2"
            android:layout_height="wrap_content" />
        <LinearLayout android:id="@+id/rightSpacer"
            android:layout_width="0dip"
            android:layout_weight="0.25"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:visibility="gone" />
    </LinearLayout>
 </LinearLayout>
I think this may help you

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:gravity="center">
    <RelativeLayout
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Login"
        android:textStyle="bold"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/textMessage"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
    <EditText
        android:layout_margin="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editUserSplash"
        android:hint="Username"
        android:layout_below="@+id/textMessage"
        android:gravity="center" />
    <EditText
        android:layout_margin="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editPasswordSplash"
        android:hint="Password"
        android:layout_below="@+id/editUserSplash"
        android:gravity="center" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Login"
        android:id="@+id/btnSplash"
        android:layout_below="@+id/editPasswordSplash"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

试试这个:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f70909">

<RelativeLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true">

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView2"
    android:adjustViewBounds="true"
    android:src="@drawable/dice"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:id="@+id/textMessage"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/imageView2" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editUserSplash"
    android:hint="Username"
    android:gravity="center"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/textMessage" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editPasswordSplash"
    android:hint="Password"
    android:layout_centerHorizontal="true"
    android:gravity="center"
    android:layout_below="@+id/editUserSplash" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Login"
    android:id="@+id/btnSplash"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/editPasswordSplash" />

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/prgSplash"
    style="@android:style/Widget.DeviceDefault.ProgressBar.Large"
    android:layout_centerHorizontal="true"
    android:indeterminate="true"
    android:layout_below="@+id/btnSplash" />

</RelativeLayout>
</RelativeLayout>

感谢 ank,我能够弄清楚 RelativeLayout 没有填满我的屏幕的原因是我在 alertDialog 中使用了它。所以 RelativeLayouts 父级不是屏幕而是 alertDialog。由于 alertDialog 包装了它的内容,因此它不会填满整个屏幕。