当我们编写Android UI的时候,肯定会遇到这样的UI设计,在屏幕宽度里面线性横向排列有三个View,每个View平分屏幕宽度。乍一看,这个很简单嘛,给这三个View都设置一个相同的width就好嘛,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="AAAAAAAA"
android:layout_width="100dp"
android:layout_height="wrap_content"/>
<Button
android:text="BBBBBBBB"
android:layout_width="100dp"
android:layout_height="wrap_content"/>
<Button
android:text="CCCC"
android:layout_width="100dp"
android:layout_height="wrap_content"/>
</LinearLayout>
但问题是它们的宽度是不确定的,有可能动态的变化,比如说它的父布局可能不是屏幕宽度等等。所以这个方法是下下策。也许有人会说,这个也不难吗,我在java代码里面动态的去设置它们的宽度相同就好了。但这个的前提是需要先获取它的父布局里的宽度,而且当当activity生命周期执行到onresume的时候,整个当前页面UI其实还没有真正的绘制到window中,这也是我们经常在生命周期中获取到某个view的width、height为0的原因,考虑到这个,开发者往往还要借助View.getViewTreeObserver().addOnGlobalLayoutListener的布局监听来解决,既然add了,那就有remove操作等,然而回到我们的问题,我不过是要view平均分配空间而已,真的需要添加如此多的代码?
另外有一些人会说,我使用LiearLayout,设置三个view的layout_weight属性都相同不就可以了吗?例如下面代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_weight="1"
android:text="aaa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_weight="1"
android:text="bbb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_weight="1"
android:text="ccc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
看上去,上面的方法好像可以解决问题,然而如果每个子view的内容宽度不一样的时候也能保持平均分配吗?答案当然是NO!例如下面代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_weight="1"
android:text="aaaaaaaaaaaaaaa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_weight="1"
android:text="bbbbb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_weight="1"
android:text="c"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
所以通过设置相同的layout_weight只能解决每个子view内容宽度都相同的情况下的问题。
现在说一个非常实用的小技巧:
在LinearLayout布局中,巧妙的设置width/height和layout_weight属性就能达到子view平均分配父view空间的效果
例子代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_weight="1"
android:text="aaaaaaaaaaaa"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<Button
android:layout_weight="1"
android:text="bbbbb"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<Button
android:layout_weight="1"
android:text="c"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
</LinearLayout>
必须要注意的是:务必将width和layout_weight搭配使用,否则代码会报错
好了,上面说的是平分父view width的例子,平分父view height的方式也是一样的,此处就不赘述了。
要想
均分
布局,必须是在
LinearLayout
布局下才可完成,其他文章中都是在
LinearLayout
中
均分
控件,现在是将
LinearLayout
中嵌套多个
LinearLayout
,
均分
LinearLayout
,这样你就可以在
LinearLayout
任意添加控件了
程序如下:
android
:layout_width="match_parent"
android
:
第一:
LinearLayout
设置水平horizontal
第二:控件设置
android
:layout_weight=“1”
第三:注意match_parent,wrap_content参考下面
<?xml version="1.0" encoding="utf-8"?>
<TextView
**
android
:layout_weight="1"**
android
:text="bbbbb"
android
:layout_width="wrap_co
要想使
LinearLayout
布局中的每个子控件自动设置为相同大小,并均匀分布,可以在布局文件中设置layout_weight参数的值一致。
示例代码如下:
<
LinearLayout
android
:layout_width="match_parent"
android
:layout_height="wrap_content"
android
:orientation=
android
:layout_width="match_parent"
android
:layout_height="wrap_content"
android
:orientation="horizontal">
<TextView
android
:id...
android
:orientation="horizontal"
android
:layout_width="fill_parent"
android
:layout_height="wrap_content"
android
:layout_alignParentBotto
可以使用ViewGroup的removeView()和addView()方法来交换两个
LinearLayout
的位置。
首先,获取两个
LinearLayout
的引用。然后,调用removeView()方法将两个
LinearLayout
从父ViewGroup中移除。最后,调用addView()方法,将两个
LinearLayout
添加回父ViewGroup中,但是指定新的位置。
ViewGroup parent = (ViewGroup)
linearLayout
1.getParent();
int index1 = parent.indexOfChild(
linearLayout
1);
int index2 = parent.indexOfChild(
linearLayout
2);
parent.removeView(
linearLayout
1);
parent.removeView(
linearLayout
2);
parent.addView(
linearLayout
2, index1);
parent.addView(
linearLayout
1, index2);
注意:在这里,我假设
linearLayout
1和
linearLayout
2是两个
LinearLayout
,并且它们已经被添加到了同一个ViewGroup中。