标签:
Android布局文件中的layout_weight属性仅在LinearLayout布局中有效。
google推荐:当设置了控件的layout_weight属性时,该控件相应的layout_width或者layout_height属性应该设置为0dp。
如果设置了控件的layout_weight属性同时,又设置了layout_width或者layout_height属性,此时有多种情况需要分析,(可能某些控件设置了layout_weight属性,某些没有设置,设置了layout_weight属性的控件中,其相应的layout_width或者layout_height属性可能相同,也可能不同,本文最后会简单介绍几种情况),编程是为了方便,不是为了自找麻烦(google都不推荐的行为,自己又何必自找麻烦)。
以下例子中设置了layout_weight属性的控件,其对应的layout_width或者layout_height属性都是0dp。
下面谈谈我对layout_weight属性的认识,如有不当之处,还请指正,下面先看几个效果,一切就都明白了
情形一
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button2" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:text="Button1" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"/> </LinearLayout>
情形二
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button2" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:text="Button1" android:layout_weight="0" android:layout_width="match_parent" android:layout_height="0dp"/> </LinearLayout>
情形三
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button2" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:text="Button1" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"/> </LinearLayout>
情形四
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button2" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:text="Button1" android:layout_weight="0" android:layout_width="match_parent" android:layout_height="0dp"/> </LinearLayout>
情形五
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button2" android:layout_width="match_parent" android:layout_height="100dp"/> <Button android:text="Button1" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"/> </LinearLayout>
情形六
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button2" android:layout_width="match_parent" android:layout_height="100dp"/> <Button android:text="Button1" android:layout_weight="0" android:layout_width="match_parent" android:layout_height="0dp"/> </LinearLayout>
情形七
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button2" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"/> <Button android:text="Button1" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button2" android:layout_weight="0" android:layout_width="match_parent" android:layout_height="0dp"/> <Button android:text="Button1" android:layout_weight="0" android:layout_width="match_parent" android:layout_height="0dp"/> </LinearLayout>
从以上例子中,不难得出如下结论:
1. 布局文件中所有控件都设置了layout_weight属性时,就按照layout_weight的大小来分配控件,值越大分配的空间越大,反之,值越小分配的空间越小。
2. 布局文件中一部分控件设置了layout_weight属性,一部分控件没有设置layout_weight属性时,没有设置layout_weight属性的控件优先分配控件,分配后如果屏幕上还有剩余空间,再给设置了layout_weight属性的控件分配。(没设置layout_weight属性的控件具有空间优先分配权)。
3. 如果空间的layout_weight属性值设置为0,则该控件不会再屏幕上显示。
-----------------------------------------------------------------分割线-----------------------------------------------------------------
------------------------------------------------------下面的例子是非推荐的-----------------------------------------------------
情形一
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="0" android:text="Button1" /> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="0" android:text="Button3" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button2" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:text="Button1" /> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="0" android:text="Button3" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button2" /> </LinearLayout>
情形三
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="match_parent" android:text="Button2" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:text="Button1" /> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="0" android:text="Button3" /> </LinearLayout>
情形四:注意此时Button3已经超出了屏幕
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button2" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="Button1" /> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="0" android:text="Button3" /> </LinearLayout>
情形五
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button2" /> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="0" android:text="Button1" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="Button3" /> </LinearLayout>
以上只是简单的找了几个例子,没有列举所有的情形,从上面的例子中,总结一下部分结论
1. 优先显示没有设置layout_height属性值或者属性值为0的控件,如果两种都存在则按照位置先后顺序依次显示(前提是屏幕还有剩余空间)
2. 如果同时存在layout_weight属性值不为0的控件和layout_weight属性值为0的控件,虽然优先显示layout_weight属性值为0的控件,但是,控件在布局文件中的先后顺序也会对屏幕显示产生影响,例如情形四和情形五所示,两者仅在布局文件中的先后位置不一样,虽然显示的顺序一样,但是情形四种的Button3超出了屏幕范围
3. 其他更复杂的情况就不介绍了
4. 综上,如果设置了控件的layout_weight属性,建议遵循google的建议,设置相应的layout_width或者layout_height属性值为0px
Android LinearLayout布局的layout_weight属性探究
标签:
原文地址:http://blog.csdn.net/mzbonnt/article/details/51428651