【问题标题】:Why does my relative layout occupy full screen width为什么我的相对布局占据全屏宽度
【发布时间】:2011-12-03 14:44:39
【问题描述】:

为什么我的相对布局占据了全屏宽度

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#f00"
    >
    <Button  
        android:id="@+id/Button01"  
        android:text="Press Here"  
        android:layout_alignParentRight="true" 
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content"></Button> 
     <Button  
        android:id="@+id/Button02"  
        android:text="02"  
        android:layout_alignParentLeft="true" 
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content"></Button>  
</RelativeLayout>

我已经指定了“wrap_content”的相对布局,那为什么它会占据全屏空间。即使我说 android:layout_width="fill_parent",输出也是一样的。

请赐教!

编辑:我想我之前的问题不是很清楚。对此表示歉意。 当我在相对布局中有 2 个子视图并且其中一个与父视图左对齐,另一个右对齐且相对布局宽度为 WRAP_CONTENT 时,我预计布局宽度只是 2 个按钮宽度的总和(不是这就是 WRAP_CONTENT 的意思??)。我知道还有其他方法可以实现我正在寻找的 UI,但我只是想正确理解这些相关的布局标签。

编辑 2:我进行了一些实验,看起来如果我们使用 Layout_AlighParentRight,其父级宽度为 WRAP_CONTENT,则上部布局宽度用于计算(就像下面指出的几个答案)。但是我们只使用了 Layout_alignParentLeft 然后它按预期工作并且布局宽度没有扩展到整个屏幕。感谢大家的帮助!

【问题讨论】:

    标签: android android-relativelayout


    【解决方案1】:

    您可能面临的另一个问题是,如果您将 2 个孩子设置为“对齐父级”+“wrap_content”,并将您的相对布局设置为“wrap_content”,并且该相对布局包含在全屏 LinearLayout 中,则您的相对布局将占据整个 LinearLayout 宽度。

    如果您同时使用“对齐父级左侧”,则相对布局会粘在左侧,其宽度实际上是“包装内容”。但是“对齐父权限”的行为是不同的,这有点奇怪。

    解决方法:

    为了解决这个问题(我必须将其中一个孩子向右对齐),我实际上将 2 个孩子设置为“对齐父母左”并使用孩子填充以使其中一个孩子位于顶部右上角。这是一个肮脏的解决方法,但我现在发现的唯一一个。

    可能的清洁解决方案:

    另一个技巧是将 2 个 LinearLayout 放入 FrameLayout 中,然后将您真正的孩子放入每个 LinearLayout 中,并利用这些 LinearLayout 的重力将孩子定位在正确的位置。

    • 相对布局
      • 线性布局
        • 孩子 1 (wrap_content)
      • LinearLayout(重力:右上角)
        • 孩子 2 (wrap_content)

    【讨论】:

      【解决方案2】:

      其他答案正确指出,当您的相对布局的宽度设置为wrap_content,并且其子级左右对齐时,相对布局采用其父级的宽度 - 在这种情况下,整个屏幕。但是,如果两个孩子都对齐到一侧,则相对布局将与最宽的孩子一样宽。

      现在,如果您希望两个按钮彼此相邻放置,并且相对布局的宽度与按钮宽度的总和一样宽,则需要稍微不同的方法。不要将两个按钮都相对于父级进行定位,而是仅使用一个按钮(例如,第一个按钮)。假设它的位置保持不变(android:layout_alignParentRight="true")。现在按钮浮动到右侧,所以第二个按钮,为了在它旁边的位置,必须与第一个按钮的左侧对齐。因此,我们只需添加android:layout_toLeftOf="@id/Button01"(并删除android:layout_alignParentLeft="true" 部分)。

      更多信息,我建议你在relative layouts上查看一个非常友好的教程。

      【讨论】:

      • 感谢欧内斯塔的回答!它现在让事情变得有点清楚了。但是我仍然对为什么如果它的孩子在左右边缘对齐,为什么相对布局会寻找它的父母的宽度感到有点震惊。嘿,恭喜你的声誉达到世纪!
      • 谢谢:)。可以这样想:wrap_content 的意思是和一个孩子占用的空间一样宽。 现在如果你带一个孩子说alignParentRight,它应该在最右边它的父母。但是父级有多宽?嗯,与一个孩子占用的空间一样宽。 换句话说,父母将其宽度的决定权留给它的孩子。而且孩子不受父母的约束,所以他们会一直走到最后——这是父母的容器。
      • 嗨,有人知道 xamarin 表单 xaml 中的这种方法吗?
      【解决方案3】:

      因为你有一个

              android:layout_alignParentLeft="true" 
      

      一个对象的宽度和一个

              android:layout_alignParentRight="true" 
      

      宽度另一个对象,然后布局扩展到两侧,给你全宽度布局。

      但是,当您使用 Layout_alignParentXXXXX 并放入父级 WRAP_CONTENT 时,这会使子级转到定义了宽度的上部布局。

      【讨论】:

      • 感谢您的回答,但对我来说不是很清楚。你是说如果我们使用 Layout_alignParentXXXX 并且父母的宽度是 WRAP_CONTENT,那么就使用上部布局(父母的父母)宽度来计算??这是真的吗?
      • 我的经验告诉我,但你可以尝试一下,放置另一个宽度为 50dip 的上层 LinearLayout 并查看结果:)
      • 我进行了一些实验,看起来如果我们使用 Layout_AlighParentRight ,其父级宽度为 WRAP_CONTENT 则上部布局宽度用于计算(如您所指出的)。但是我们只使用了 Layout_alignParentLeft 然后它按预期工作并且布局宽度没有扩展到整个屏幕。感谢基罗加的帮助!
      【解决方案4】:

      这一行使“Press Here”按钮 (Button01) 向右对齐:

      android:layout_alignParentRight="true" 
      

      这会使您的布局在宽度上填充父级。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-28
        • 2019-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多