Android中的layout_weight和layout_width布局原理

刚学android布局,对layout_weight布局一直不是很理解,网上到处找资料,也觉得没有真正讲明白,有些文章都是作者自己测试得出来的一些经验,虽然有用,但是还是不明白里面的原理。今天我想仔细讲讲这个,给初学android的人一点指点。

首先,我们来看个例子,布局XML是:

  <RadioGroup
          android:id="@+id/favorite_rg"
          android:layout_width="fill_parent"
          android:layout_height="50dip" 
          android:orientation="horizontal">
            <RadioButton 
                android:id="@+id/favorite_article_rb"
				android:layout_width="0dp"
	            android:layout_height="50dip"
	            android:layout_weight="1"
				android:text="宝典"
				android:textSize="20dip"
				android:button="@null"
				android:gravity="center"
				android:textColor="@color/good_detail_radiobutton_text"
				android:background="@drawable/good_detail_rb" />

            <RadioButton 
                android:id="@+id/favorite_good_rb"
				android:layout_width="0dp"
	            android:layout_height="50dip"
	            android:layout_weight="1"
				android:text="产品"
				android:textSize="20dip"
				android:button="@null"
				android:gravity="center"
				android:textColor="@color/good_detail_radiobutton_text"
				android:background="@drawable/good_detail_rb" />
        </RadioGroup>

 

 

显示效果是这样的:

1

 

 

2个按钮平均分配了。 那android是怎么给按钮分配的空间呢? 我们发现RadioButton组件里面有部分属性都是layout_*打头的,这些属性其实就是告诉它的父组件RadioGroup应该怎么布局子组件,当父组件的android:orientation=”horizontal”水平布局的时候,父组件会先按照子组件的layout_width分配对应的空间剩下的宽度(父组件的宽度减掉2个RadioButton的layout_width)再按子组件的layout_weight分配,因为2个RadioButton的layout_weight=1,所以分别将剩余的空间按1/2, 1/2瓜分。如果2个RadioButton的layout_width之和超过了父组件的width,那么就会有问题,这种情况在此不作讨论,因为真正做软件时这种情况是错误的。

结论:很多情况下我们仅仅想让子元素按照layout_weight设置的比例分配空间,那么这就需要你把layout_width设置成0。 如果父组件是android:orientation=”vertical”,那子组件将layout_height设置成0即可。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>