为了让组件在不同手机屏幕上都能运行良好——不同手机屏幕的分辨率、尺寸并不完全相同,如果让程序手动控制每个组件的大小、位置,将给编程带来巨大困难,为了解决这个问题,Android提供了布局管理器。布局管理器可以根据运行平台来调整组件的大小,程序员执照选择合适的布局管理器,而安卓的布局管理器本身就是一个UI组件,所有的布局管理器都是ViewGroup的子类。
布局管理器分为线性布局(LinearLayout)、相对布局(RelativeLayout)、绝对布局(AbsoluteLayout)、帧布局(FrameLayout)、表格布局(TableLayout)
线性布局
线性布局中的控件是一个挨着一个排列起来的,通过设置android:orientation:属性控制是横向排列还是竖向排列。线性布局的不会换行,当组件排列到头后剩下的组件将不会被显示出来。
属性:android:divider 相关方法setDividerDrawable(Drawable)设置垂直布局时两个按钮 之间的分割条
android:gravity 相关方法setGravity(int)设置布局管理器内部的组件之间的对齐方式
Android:orientation 相关方法 setOrientation(int)设置布局管理器内组件的排列方式,可 以为horizontal或vertical
android:weightSum
该布局管理器中的组件的属性:android:layout_gravity 指定的是该元素在该布局管理 器中的对齐方式。该属性只能应用于同级的子元素的处理,若子元素都是组件或都是容 器才可以起作用,
Android:layout_weight 指定该子元素在LinearLayout中所占的权重,可以与元素管理器 的weightSum共同使用,并设置width=0dp此时按照计算式计算
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="10dp"
android:weightSum="3">
<!-- 销售 -->
<LinearLayout
android:id="@+id/s_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="1"
android:background="@drawable/item_bg"
android:gravity="center"
android:orientation="vertical"
>
<ImageView
android:id="@+id/s_imageview"
android:layout_width="wrap_content"
android:layout_height="80dip"
android:scaleType="fitCenter"
android:src="@drawable/main1"/>
<TextView
android:id="@+id/s_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:textColor="#404040"
android:textSize="@dimen/text_size"
android:text="@string/xs"/>
</LinearLayout>
Gravity和layout_gravity使用例子:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="bottom|center_horizontal"
>
<LinearLayout
android:layout_width="400dp"
android:layout_height="300dp"
android:orientation="horizontal"
>
<Button
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="111"
android:layout_gravity="bottom|center_horizontal"/>
<Button
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:text="222"/>
</LinearLayout>
</LinearLayout>
深入理解如何使用weight:
定义weight总和的最大值,如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。
若设置了weightSum则就相当于将容器按照weightSum比例划分了,每个控件的权重就是器所占的比例数。
使用(即按比例分配)
(1)未使用weightSum实现平均分配,线性布局中的所有控件的权重值相同
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
(2)未使用weightSum实现平均分配,线性布局中的所有控件的权重值相同
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
上面这两个例子实现的效果相同,而针对第二个例子可以这样理解,权重和是2,假设线性布局的总长是100,则每个控件的长度是0dp+100/2*1
(3)未使用weightSum按比例分配match_parent
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
上面的两个控件所占的比例分别是三分之一和三分之二,而所占比例越大实际分配的控件越小
(4)未使用weightSum按比例分配 0dp
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
此时则按照计算式进行分配假设100是布局管理器的长度分别是0dp+100/3*2 和 0dp+100/3*1
(5)设置weightSum但小于权重和 长度是match_parent
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="2222"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1111"
/>
</LinearLayout>
效果:
(6)设置weightSum但小于权重和 长度是0dp
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="2222"
/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1111"
/>
</LinearLayout>
(7)当weightSum的值与权重和相同时就相当于没有设置weightSum的效果。
(8)当weightSum的值大于权重和时
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="4">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="2222"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1111"
/>
</LinearLayout>
(9)当weightSum值大于权重和时 0dp
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="4">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="2222"
/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1111"
/>
</LinearLayout>
通过上面的效果可以看出设置长度为0dp时,会根据比例的计算式分配长度。