【问题标题】:Android: Possible Bug in AndroidAndroid:Android 中可能存在的错误
【发布时间】:2023-12-19 21:43:01
【问题描述】:

我有两个Views,用来在屏幕上排列一些buttons。我看到结果的屏幕尺寸是横向模式下的 Moto G - 640dp * 360dp。问题是 - buttons 正在根据带有 id=center_parent 的视图而不是带有 id=left_corner 的视图来排列它们

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

    <View android:id="@+id/center_parent"
      android:layout_centerInParent="true"
      android:layout_width="0dp"
      android:layout_height="0dp"/>

   <View android:id="@+id/left_corner"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:layout_toLeftOf="@+id/center_parent"
      android:layout_marginRight="165dp"
      android:layout_above="@+id/center_parent"
      android:layout_marginBottom="150dp"
      android:layout_alignParentTop="true"/>"

   <Button android:id="@+id/btn1"
      android:layout_height="20dp"
      android:layout_width="20dp"
      android:padding="0dp"
      android:layout_toRightOf="@+id/left_corner"
      android:layout_marginLeft="165dp"
      android:layout_below="@+id/left_corner"
      android:layout_marginTop="5dp"
      android:text="1"
      android:textColor="@android:color/black"
      android:background="@drawable/star"/>

   <Button android:id="@+id/btn2"
      android:layout_height="20dp"
      android:layout_width="20dp"
      android:padding="0dp"
      android:layout_toRightOf="@+id/left_corner"
      android:layout_marginLeft="330dp"
      android:layout_below="@+id/left_corner"
      android:layout_marginTop="171dp"
      android:text="2"
      android:textColor="@android:color/black"
      android:background="@drawable/star"/>

    <Button android:id="@+id/btn3"
      android:layout_height="20dp"
      android:layout_width="20dp"
      android:padding="0dp"
      android:layout_toRightOf="@+id/left_corner"
      android:layout_marginLeft="292dp"
      android:layout_below="@+id/left_corner"
      android:layout_marginTop="171dp"
      android:text="3"
      android:textColor="@android:color/black"
      android:background="@drawable/star"/>

    <Button android:id="@+id/btn4"
      android:layout_height="20dp"
      android:layout_width="20dp"
      android:padding="0dp"
      android:layout_toRightOf="@+id/left_corner"
      android:layout_marginLeft="292dp"
      android:layout_below="@+id/left_corner"
      android:layout_marginTop="292dp"
      android:text="4"
      android:textColor="@android:color/black"
      android:background="@drawable/star"/>

</RelativeLayout>!

附件是它在屏幕上的外观图像。尽管箭头显示是使用 left_corner 测量的,但事实并非如此。如果我将buttons中的left_corner替换为center_parent,同时排列结果是一样的。

The marked arrow is left_corner

我找到了替代方案。所以替代方案不是我想要的。我很想学习对此的解释。

【问题讨论】:

    标签: android xml android-layout views android-relativelayout


    【解决方案1】:

    layout_marginLeftlayout_marginRight 太多了。

    先去掉所有的边距,你会看到正确的视图。然后相应地再次开始添加边距。

    您需要在这里观察一些事情。

    layout_marginBottom 将 left_corner 推离 center_parent 太远

    layout_marginRight 将 left_corner 推离 center_parent 太远 您必须下定决心将控件放置在何处并与什么对齐。

    <?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">
    
        <View android:id="@+id/center_parent"
          android:layout_centerInParent="true"
          android:layout_width="10dp"
          android:layout_height="10dp"/>
    
       <View android:id="@+id/left_corner"
          android:layout_width="10dp"
          android:layout_height="10dp"
          android:layout_toLeftOf="@+id/center_parent"
          android:layout_marginRight="10dp"
          android:layout_above="@+id/center_parent"
          android:layout_marginBottom="10dp"
          android:layout_alignParentTop="true"/>"
    
       <Button android:id="@+id/btn1"
          android:layout_height="20dp"
          android:layout_width="20dp"
          android:padding="0dp"
          android:layout_toRightOf="@+id/left_corner"
          android:layout_marginLeft="10dp"
          android:layout_below="@+id/left_corner"
          android:layout_marginTop="0dp"
          android:text="1"
          android:textColor="@android:color/black"
          android:background="@drawable/star"/>
    
       <Button android:id="@+id/btn2"
          android:layout_height="20dp"
          android:layout_width="20dp"
          android:padding="0dp"
          android:layout_toRightOf="@+id/left_corner"
          android:layout_marginLeft="10dp"
          android:layout_below="@+id/left_corner"
          android:layout_marginTop="20dp"
          android:text="2"
          android:textColor="@android:color/black"
          android:background="@drawable/star"/>
    
        <Button android:id="@+id/btn3"
          android:layout_height="20dp"
          android:layout_width="20dp"
          android:padding="0dp"
          android:layout_toRightOf="@+id/left_corner"
          android:layout_marginLeft="10dp"
          android:layout_below="@+id/left_corner"
          android:layout_marginTop="40dp"
          android:text="3"
          android:textColor="@android:color/black"
          android:background="@drawable/star"/>
    
        <Button android:id="@+id/btn4"
          android:layout_height="20dp"
          android:layout_width="20dp"
          android:padding="0dp"
          android:layout_toRightOf="@+id/left_corner"
          android:layout_marginLeft="10dp"
          android:layout_below="@+id/left_corner"
          android:layout_marginTop="60dp"
          android:text="4"
          android:textColor="@android:color/black"
          android:background="@drawable/star"/>
    
    </RelativeLayout>
    

    使用上面的 xml,我得到了下面的输出。

    【讨论】:

    • 我不明白在这种情况下有什么问题。 Moto g - 横向宽度 = 640dp。 left_corner = 165dp marginRight 从中心。并且按钮一 = left_corner 的 165dp marginLeft。所以它应该基本上在屏幕的中心(水平)。你怎么能说利润太多了
    • @Mohan - 我还尝试将button1margin_rightmargin_bottom 指定为0dp,令人惊讶的是它与center_parent 视图重叠
    • 先生,我同意您的编辑。但是,从数学上思考一下。屏幕尺寸 = 360dp x 640dp(在 landscape 模式下)。 left_corner=165dp 向左,150dp 位于屏幕中心上方 (center_parent)。 btn1 向右 (165dp) 和 left_corner 下方。所以 btn1 应该在 center_parent 之上并且几乎与 left_corner 水平对齐。你怎么能说保证金太多了。 P.S 我正在使用full screen 模式