为什么我的相对布局占据整个屏幕宽度

7
为什么我的相对布局占满了整个屏幕宽度?
<?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",输出也是相同的。请解释一下!
请启迪我!
编辑:我觉得我之前的问题表述不够清晰。对此感到抱歉。 当我在相对布局中有两个子视图时,其中一个左对齐父视图,另一个右对齐,并且相对布局的宽度为WRAP_CONTENT,则我期望布局的宽度只是2个按钮宽度的总和(这不是WRAP_CONTENT的意思吗?)。我知道还有其他实现所需UI的方法,但我只是想正确理解这些相对布局标记。
编辑2:我进行了一些实验,看起来如果我们使用Layout_AlighParentRight并将其父宽度设置为WRAP_CONTENT,则上部布局的宽度用于计算(就像下面的答案所指出的那样)。但是,如果我们只是使用Layout_alignParentLeft,那么它将按预期工作,布局宽度不会延伸到整个屏幕。感谢大家的帮助!
4个回答

15
其他答案已经正确指出,当您的相对布局宽度设置为wrap_content,并且其子元素对齐到左右两侧时,相对布局将占用其父级的宽度 - 在这种情况下,整个屏幕。但是,如果两个子元素都对齐到一侧,则相对布局的宽度将与最宽的子元素一样。
现在,如果您想要将两个按钮放置在一起,并且相对布局的宽度等于两个按钮宽度之和,则需要稍微不同的方法。不要将两个按钮都相对于父级定位,而是只使用一个按钮(例如第一个按钮)进行定位。假设它的定位保持不变(android:layout_alignParentRight="true")。现在,该按钮向右浮动,因此为了将第二个按钮定位在其旁边,必须将其与第一个按钮的左侧对齐。因此,我们只需添加android:layout_toLeftOf="@id/Button01"(并删除android:layout_alignParentLeft="true"部分)即可。
更多信息,请查看relative layouts上非常友好的教程。

谢谢你的回答Ernesta!现在事情清晰了一些。但是我仍然有点困惑,为什么相对布局会查找其父宽度,如果其子元素都对齐在左右两侧。顺便说一下,恭喜你声望达到了100分! - Santosh
3
这样想:wrap_content 的意思是“宽度与子元素占据的空间一致”。现在,如果你选取一个子元素并设置 alignParentRight,那么该元素应该会位于其父元素的最右侧。但是父元素有多宽呢?嗯,宽度与子元素占据的空间一致。换句话说,父元素将其宽度的决定权交给了子元素。而子元素不受父元素的限制,因此它们会一直延伸到最后 - 即父容器的边界。 - user519908
大家好,有人对在Xamarin Forms XAML中采用这种方法有什么想法吗? - Suresh

4
由于您拥有一个


        android:layout_alignParentLeft="true" 

调整对象宽度,以及一个

        android:layout_alignParentRight="true" 

如果你想要将另一个对象的宽度与该布局相同,那么这个布局会向两侧延伸,从而实现完整的宽度布局。

但是当你使用layout_alignParentXXXXX时,并且将parent设置为WRAP_CONTENT,这会使子view根据父布局的宽度定义,去适应上层布局。


谢谢回答,但这对我来说不是很清楚。你是说如果我们使用Layout_alignParentXXXX,而父级的宽度是WRAP_CONTENT,那么上层布局(父级的父级)的宽度将被用于计算?这是真的吗? - Santosh
我的经验告诉我,但你可以尝试一下,在另一个上层LinearLayout中设置宽度为50dip,看看结果 :) - A.Quiroga
我进行了一些实验,看起来如果我们使用Layout_AlighParentRight,并将其父宽度设置为WRAP_CONTENT,则上层布局的宽度用于计算(正如您所指出的)。但是,如果我们仅使用Layout_alignParentLeft,则它会按预期工作,并且布局宽度不会延伸到整个屏幕。感谢您的帮助Quiroga! - Santosh

1

这行代码将“按此处”按钮(Button01)向右对齐:

android:layout_alignParentRight="true" 

这会使您的布局在宽度上填满父元素。


0

你可能会遇到的另一个问题是,如果你将你的两个子元素设置为“align parent right”+“wrap_content”,并且将相对布局设置为“wrap_content”,并且该相对布局包含在全屏LinearLayout中,那么你的相对布局将占据整个LinearLayout的宽度。

如果你使用“align parent left”来做同样的事情,那么相对布局会停留在左边,并且它的宽度确实是“wrap content”。但是,“align parent right”的行为是不同的,这有点奇怪。

解决方法:

为了解决这个问题(我必须将其中一个子元素对齐到右侧),我实际上将这两个子元素设置为“align parent left”,并通过调整子元素的填充来使其中一个子元素位于右上角。这是一个不太好的解决方法,但目前我只找到了这一个。

可能更好的解决方案:

另一个技巧是将2个LinearLayout放在FrameLayout中,然后在每个LinearLayout中放置你的真正的子元素,并通过调整这些LinearLayout的重力来定位子元素的位置。

  • 相对布局
    • 线性布局
      • 子元素1(自适应内容)
    • 线性布局(重力:右上角)
      • 子元素2(自适应内容)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接