为什么按钮会拉伸以覆盖所有已分配的layout_weight

时间:2012-03-19 19:48:16

标签: android android-layout

我想让3个按钮对齐(左,中,右)。我知道它可能可以通过引力来完成,但我想在这里尝试理解layout_weight概念。我正在使用此代码:

<LinearLayout
id=..
layout_width =  "wrap_content"
layout_height = "wrap_content"
orientation="Horizonta"
>
 <Button
  id=1
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  layout_weight = "1"
  text= "text" />

 <Button
  id=2
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  layout_weight = "1"
  text= "text" />

 <Button
  id=3
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  layout_weight = "1"
  text= "text" />
</LinearLayout>

但是,我正在获得下图中的TOP部分。哪个是对的。问题是为什么当我使用wrap_content时按钮被拉伸以覆盖它所分配的所有区域?如何使它像BOTTOM图像一样?

enter image description here

谢谢

3 个答案:

答案 0 :(得分:6)

layout_weight用于指示如何在窗口小部件之间划分屏幕上的额外可用空间。在这种情况下,我们有三个具有相同layout_weight的按钮,因此按钮也会增长,直到所有可用空间都消失为止。

必须尝试其他方法才能获得原始尺寸按钮和我们想要的对齐方式(左 - 中 - 右)。一个问题是,当涉及到layout_gravity参数时,水平LinearLayout不是完全协作的。我们将能够使用影响垂直对齐的layout_gravity参数,但父级LinearLayout会忽略水平,感叹另一个死胡同。

解决方案是在按钮之间放置一些东西,将它们推到屏幕的正确位置。太空视图在API 14(冰淇淋三明治)中引入,适合用于此目的。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

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

     <Space
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight = "1" />

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

    <Space
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight = "1" />

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

</LinearLayout>

Space视图也可以替换为几个空的TextView,以使设计适用于运行早期API级别的设备。

<TextView
    android:id="@+id/textView1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1.0"
    android:text="" />     

答案 1 :(得分:2)

使用权重时,省略layout_width,仅使用权重算法,然后拉伸元素。

答案 2 :(得分:1)

您的按钮填满了空间,因为您使用layout_weight="1"告诉按钮占用额外的空间,也因为所有按钮的layout_weight属性为1,它们将占用相同的空间并拥有相同的大小。您无法使用layout_weight获取底部布局,请使用layout_gravity定位它们(​​这是关于此What does android:layout_weight mean?的另一个问题)。

如果你想要波纹管图像,试试这个:

<LinearLayout
id=..
layout_width =  "wrap_content"
layout_height = "wrap_content"
orientation="Horizonta"
>
 <Button
  id=1
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  android:layout_gravity="left"
  text= "text" />

 <Button
  id=2
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  android:layout_gravity="center_horizontal"
  text= "text" />

 <Button
  id=3
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  android:layout_gravity="right"
  text= "text" />
</LinearLayout>