【问题标题】:relative layout gravity center not aligning correctly相对布局重心未正确对齐
【发布时间】:2016-04-20 07:01:40
【问题描述】:

我正在尝试将我的相对布局的子项置于屏幕中心,但它的行为就像它与父级的顶部对齐,我不知道为什么。

我的 .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:我将 RelativeLayout 的背景设置为红色并得到了这个: 所以 relativelayout 没有填满我的屏幕。

编辑 3: 编辑 4:

【问题讨论】:

  • 使用 android:layout_centerInParent = "true"
  • 你是指父母还是孩子?
  • 你到底想要什么??
  • 发布您的屏幕截图并说明您的需求。

标签: android android-layout android-relativelayout gravity


【解决方案1】:

试试这个:

<?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>

【讨论】:

    【解决方案2】:

    试试这样的。

    <?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,则可能在底部分配了一个空间。我在谷歌上找到了这个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>
    

    【讨论】:

    • 运气不好,图像仍然与屏幕顶部对齐
    • 现在视图在图像中居中,因此相对布局由于某种原因没有填满我的整个屏幕...
    • @ank 这将 Overlap 图像居中时的其他视图。
    • 可能不相关,但您是在活动或片段中设置 xml 吗?
    • 它实际上在带有android.R.style.Theme_DeviceDefault_Light_NoActionBar_Fullscreen 的alertDialog 中,所以对话框是它的父级,而不是屏幕......你说得对,我没有想到这一点。想我得作弊了。您可以编辑您的答案以便我接受吗?
    【解决方案3】:
    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>
    

    【讨论】:

    • 同样的问题,当我这样做时,布局只会变得和图像一样大。它将外部布局视为wrap_content 而不是match_parent
    • 你能把截图发给我吗?
    • 现在只需从布局中删除 android:background="@drawable/dice"。它会工作
    • 添加了屏幕截图,线性布局与其父级不匹配,只是在包装其内容
    • 看看我现在更新我的答案检查。让我不知道它是否正确?
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2016-05-13
      相关资源
      最近更新 更多