安卓布局权重

84

我是Android开发的新手,关于在线性布局中设置权重的问题有一个疑问。

我试图创建一行包含两个自定义按钮和一个自定义编辑框。编辑框应该只占用其内容所需的空间,而两个按钮则应水平扩展以填充行中其余的可用空间。就像这样...

| [#Button++#] [#Button--#] [et] |

经过多次尝试,这是我能够接近我想要的东西的最佳尝试,尽管它似乎过于复杂。

| [Button] [Button] [###ET###] |

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal|center_vertical"
    android:layout_weight="1"
    >

    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_plus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_plus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/tv_dice_plus" 
                android:text="@string/tv_plus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_minus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_minus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/btn_minus" 
                android:text="@string/tv_minus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <EditText 
            android:textColor="#FAFAF4"
            android:text="@string/et_output" 
            android:id="@+id/et_output" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:inputType="number"
            android:selectAllOnFocus="true" 
            android:minWidth="50sp"         
            android:maxWidth="50sp"
            android:background="@drawable/tv_black_background3"
            android:textColorHighlight="#c30505"
            ></EditText>
    </LinearLayout>
</LinearLayout>

根据我的理解,为包含按钮的线性布局设置[android:layout_weight="2"]应该使它们占用比编辑文本更多的空间,但对我来说情况相反,使它们都变成了一半大小。

| [Btn] [Btn] [#####et#####] |

我尝试了很多组合,甚至记不清楚具体有哪些,但都没有起作用。

8个回答

213

它不起作用是因为你使用了fill_parent作为宽度。weight用于分配剩余的空白空间或者在总和大于LinearLayout时收回空间。将宽度设置为0dip,它将会有效。


6
将线性布局的宽度设置为0dip就像我想要的一样。我不知道那是一个选项。这解释了为什么它可以奏效,而wrap_content则不能。当没有内容时,将宽度设置为wrap_content会使其消失,但将其设置为0dip可以使其从空白状态伸展到需要的任何大小。非常感谢。 - UnluckyDevil
37
我也尝试过这个方法,谢谢。不过我必须说,有没有其他人觉得安卓的布局系统很奇怪且不直观? - tstyle
“权重”用于分配剩余的空间,这意味着宽度为1dp也可以使用,对吗? - Elad Benda
请问您能否举个例子,在总和超过LinearLayout时去掉空间? - Elad Benda2
这个时候基于IDE的警告会非常受欢迎。只是说一下。 - Neon Warge
显示剩余5条评论

14

android:Layout_weight属性可用于在宽度没有固定值(如fill_parent)时使用。

像这样进行操作:

<Button>

Android:layout_width="0dp"
Android:layout_weight=1

-----other parameters
</Button>

7

这样想,会更简单

如果你有三个按钮,它们的权重分别为1、3、1,它将像HTML中的表格一样工作

为该行提供5个部分:1个部分用于按钮1,3个部分用于按钮2,1个部分用于按钮1


4
在LinearLayout中设置WeightSum=2,并将权重分配给其子元素,以使它们按您想要的方式显示。我已经给了子元素权重"1"。因此,两个子元素将平均分配总和的一半。
 <LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/maila_oss" />
</LinearLayout>

2

权重值0-1共享可用空间的分配比例(在设置layout_width="0px"后)。未指定权重(没有权重条目)的View元素获得权重0,这意味着它们不会扩展。

一种简单的替代方法是将跑马灯附加到具有文本的视图上,告诉它从文本所需的最小值(wrap_content)扩展到可用空间。

EditText: android:layout_width="wrap_content" android:ellipsize="marquee"


0
<LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="9"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
<EditText
        android:id="@+id/edittxt"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
</LinearLayout>

0
我建议将EditText的宽度设置为wrap_content,并将这两个按钮放入一个LinearLayout中,其宽度设置为fill_parent,权重设置为1。

0

我发现了另一个可能较为含糊的原因。以下内容无法正常工作。

LinearLayout vertical

LinearLayout height fillparent + weight

LinearLayout height fillparent + weight

LinearLayout height fillparent + weight

EndLinearLayout

而下面这个是正常工作的:

RelativeLayout

LinearLayout vertical

LinearLayout height fillparent + weight

LinearLayout height fillparent + weight

LinearLayout height fillparent + weight

EndLinearLayout

EndRelativeLayout

虽然使用包含线性和权重的根布局无法正常工作。当我说“无法正常工作”时,我的意思是,在不同分辨率下查看图形布局后,屏幕的一致性严重受损。


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