API 23 widget.LinearLayout——属性分析

来源:互联网 发布:阶层的算法c语言 编辑:程序博客网 时间:2024/05/04 10:02


参阅:http://android.xsoftlab.net/reference/android/widget/LinearLayout.html

 

public class

LinearLayout

extends ViewGroup

Added in API level 1 

 

java.lang.Object

  android.view.View

       android.view.ViewGroup

           android.widget.LinearLayout

 

已知直接子类:

ActionMenuView

AppBarLayout

ListRowHoverCardView

ListRowView

NumberPicker

RadioGroup

SearchView

TabWidget

TableLayout

TableRow

TextInputLayout

ZoomControls

 

【概述】

布置子视图在一行或一列的布局。可以通过调用setOrintation()来设置布局方向。还可以指定重力,通过调用setGravity()指定所有子元素的对齐方式,或通过设置LinearLayout.LayoutParamsweight来指定特定的子视图来填充满剩余的布局空间。

布局方向默认是水平的。

 

LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的containers,超过边界时,某些控件将缺失或消失。

因此一个垂直列表的每一行只会有一个widget或者是container,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子控件的高度加上边框高度)。

LinearLayout保持其所包含的widget或者是container之间的间隔以及互相对齐(相对一个控件的右对齐、中间对齐或者左对齐)。

 

不换行属性 线性布局中的组件不会自动换行,如果组件一个一个排列到尽头之后,剩下的组件就不会显示出来;

 

【嵌套类】

LinearLayout.LayoutParams每个孩子与ViewLinearLayout相关的布局信息

 

LinearLayout.LayoutParams

androidlayout_gravity

属性说明:表示组件自身在父组件中的位置默认值left

可以是以下一个或多个(用|分隔)常量:

top                 将对象推送到其容器的顶部,而不更改其大小。

bottom              将对象推送到其容器的底部,而不更改其大小。

left                将对象推送到其容器的左侧,而不更改其大小。

right               将对象推送到其容器的右侧,而不更改其大小。

center              将对象放置在其容器的垂直和水平轴的中心,而不改变其大小。

center_vertical     将对象放置在其容器的垂直中心,而不改变其大小。

centet_horizontal   将对象放置在其容器的水平中心,而不改变其大小。

Fill                如果需要,增大对象的水平和垂直尺寸,以便它完全填充其容器。

fill_vertical       如果需要,增大对象的垂直尺寸,以便它完全填充其容器。

fill_horizontal     如果需要,增大对象的水平尺寸,以便它完全填充其容器。

clip_vertical       附加的可选设置,它可以设置容器内子对象的上下边缘裁剪它的容器边框。裁剪会基于垂直对齐的方式:顶部对齐的会

                裁剪底部边缘,底部对齐的会裁剪顶部边缘,不会上下边缘都裁剪。

clip_horizontal     附加的可选设置,它可以设置容器内子对象的左右边缘裁剪它的容器边框。裁剪会基于水平对齐的方式:左对齐的会裁剪

                 右边缘,右对齐的会裁剪左边缘,不会左右边缘都裁剪。

start            将对象推送到其容器的起始处,而不更改其大小。

end              将对象推送到其容器的结尾处,而不更改其大小。

对应的全局属性资源符号是layout_gravity

 

LinearLayout.LayoutParams

androidlayout_weight

属性说明:设置组件的权重。表示组件在父控件剩余空间的占比

必须是浮点值(float),如:1.2

也可以引用一个包含此类型值的资源格式:@[package:]type:name或主题属性(格式:?[package][type:]name)。

对应的全局属性资源符号是layout_weight

 

首先声明只有在Linearlayout中,该属性才有效。用于给一个线性布局中的诸多视图的重要程度赋值。所有的视图都有一个layout_weight值,默认为0

在设置该属性的同时,布局为水平方向时,设置android:layout_widthwrap_contentmatch_parent会造成两种截然相反的效果。

android:layout_weight的真实含义是:一旦组件设置了该属性(假设有效的情况下),那么该组件的宽度等于原有宽度(android:layout_width)加上剩余空间的占比

Google官方推荐,当使用weight属性时,将width设为0dip即可,效果跟设成wrap_content是一样的。这样weight就可以理解为占比了!

水平方向 android:orientation="vertical"  推荐设android:layout_width="0dp"

垂直方向android:orientation="horizontal"推荐设置android:layout_height="0dp"

 

源码片段:

int delta = widthSize - mTotalLength;

 

int share = (int) (childExtra * delta / weightSum);                       

weightSum -= childExtra;  //分配完成后,在总量里面减去已分配部分

delta-= share;  

 

int childWidth = child.getMeasuredWidth() + share;  

if (childWidth < 0) { childWidth = 0 ;}  

(水平方向)剩余空间 = LinearLayout的宽度- 所有子viewlayout_width的和

weight总和

【子view1】分配空间= 剩余空间*占比

view宽度= layout_width + 分配空间

新剩余空间

weight总和

【子view2】新分配空间= 新剩余空间*新的占比

view宽度= layout_width + 新分配空间

 

LinearLayout.LayoutParams

继承自view.ViewGroup.MarginLayoutParamsxml属性

继承自view.ViewGroup.LoutParamsXML属性

 

XML属性】

android:baselineAligned

关联方法:setBaselineAligned(booleanbaselineAligned)

属性说明:是否允许用户调整它内容的基准线。默认为true

必须是布尔值(boolean),true”或“false”。

也可以引用一个包含此类型值的资源格式:@[package:]type:name或主题属性(格式:?[package][type:]name)。

对应的全局属性资源符号是baselineAligned

 

当设置为false时,防止布局对齐其子项的基线。 当孩子使用不同的重力值时,此属性特别有用。

在以字母为书写语言的其他国家非常常见。

示意图:

 

android:baselineAlignedChildIndex

关联方法:setBaselineAlignedChildIndex(int i)

属性说明:当线性布局是另一个基线对齐的布局的一部分时,它可以指定其子对象与基线对齐(即,哪个子TextView)。默认为0,当前LinearLayout作为其他layout的子View时,以该LinearLayout中哪个View

TextViewButtonEditView)的基准线为对外基准线

必须是整型值(integer),如:100

也可以引用一个包含此类型值的资源格式:@[package:]type:name或主题属性(格式:?[package][type:]name)。

对应的全局属性资源符号是baselineAlignedChildIndex

 

注意,用了baselineAlignedChildIndex就不要用类似android:layout_gravity="center_vertical"这种定位的代码了,因为会冲突,就不会出现我们想要的效果了。

  

android:divider

API 11以上,API11以下可使用ImageView添加

关联方法:setDividerDrawable(Drawable divider)

属性说明:设置drawable用作子View间的分隔线。

可以引用另一个资源(格式:@[package:]type:name)或主题属性(格式:?[package][type:]name

可以是颜色值(color),格式#rgb”、”#argb”、”#rrggbb”、”#aarrggbb”。

对应的全局属性资源符号是divider

 

android:showDividers不为none时才会显示。

android:divider="@drawable/list_driver"  其中@drawable/list_driver是一个图片资源

android:divider="@drawable/@null"     不显示分隔线

 

API文档中未找到的属性

android:showDividers

API 11,需要和android:divider配合使用

关联方法:setShowDividers(int showDividers)

属性说明:设置在此布局中项目之间如何显示分隔。默认为none

必须为下列常量值之一或多个(使用|”分隔):

none       不显示

beginning  LinearLayout开始处显示

middle     LinearLayout的每两个组件间显示(常用)

end        LinearLayout结尾处显示

对应的全局属性资料符号是showDividers

 

API文档中未找到的属性

android:dividerPadding

API 11

关联方法:setDividerPadding(int padding)

属性说明:设置分割线两端到边界的距离。

必须是带单位的浮点型尺寸值float,如:14.5sp”。有效的单位包括:px(像素)dp(密度无关像素)sp(通常用于字体尺寸的可伸缩像素)in(英寸)mm(毫米)

也可以引用一个包含此类型值的资源格式:@[package:]type:name或主题属性(格式:?[package][type:]name)。

对应的全局属性资源符号是dividerPadding

 

android:gravity

关联方法:setGravity(int gravity)

属性说明:设置对象如何在X轴和Y轴上在自己的边界内定位其内容。默认值left

必须是下列常量值中的一个或多个(用|分隔):

top                   将对象推送到其容器的顶部,而不更改其大小。

bottom                将对象推送到其容器的底部,而不更改其大小。

left                  将对象推送到其容器的左侧,而不更改其大小。

right                 将对象推送到其容器的右侧,而不更改其大小。

center                将对象放置在其容器的垂直和水平轴的中心,而不改变其大小。

center_vertical       将对象放置在其容器的垂直中心,而不改变其大小。

centet_horizontal     将对象放置在其容器的水平中心,而不改变其大小。

fill                  如果需要,增大对象的水平和垂直尺寸,以便它完全填充其容器。

fill_vertical         如果需要,增大对象的垂直尺寸,以便它完全填充其容器。

fill_horizontal       如果需要,增大对象的水平尺寸,以便它完全填充其容器。

clip_vertical         附加的可选设置,它可以设置容器内子对象的上下边缘裁剪它的容器边框。裁剪会基于垂直对齐的方式:顶部对齐的会

                   裁剪底部边缘,底部对齐的会裁剪顶部边缘,不会上下边缘都裁剪。

clip_horizontal       附加的可选设置,它可以设置容器内子对象的左右边缘裁剪它的容器边框。裁剪会基于水平对齐的方式:左对齐的会裁

                   剪右边缘,右对齐的会裁剪左边缘,不会左右边缘都裁剪。

start              将对象推送到其容器的起始处,而不更改其大小。

end                将对象推送到其容器的结尾处,而不更改其大小。

它对应的全局资源符号是gravity


特殊情况:

当我们采用LinearLayout布局时,有以下特殊情况需要我们注意:

android:orientation="vertical"   android:layout_gravity只有水平方向的设置才起作用

垂直方向的设置不起作用。即:leftrightcenter_horizontal是生效的。

android:orientation="horizontal" android:layout_gravity只有垂直方向的设置才起作

,水平方向的设置不起作用。即:topbottomcenter_vertical是生效的。

比较特殊的是center,不管是横向还是纵向的时候,它总有一个方向起作用。


android:measureWithLargestChild

关联方法:setMeasureWithLargestChildEnabled(boolean enabled)

属性说明:该属性为true的时候,所有带权重的子元素都会具有最大子元素的最小尺寸。默认为false

如果为false,则所有儿童均正常测量。

必须是布尔值(boolean),true”或“false”。

也可以引用一个包含此类型值的资源格式:@[package:]type:name或主题属性(格式:?[package][type:]name)。

对应的全局属性资源符号是measureWithLargestChild

 

如果layout_width不是“wrap_content”,则measureWithLargestChild不起作用

所有带权重的view的宽和高将按照最大view的宽和高来布局。

LinearLayout的宽和高为最大view的宽和高为基准乘以view的个数。

android:orientation="horizontal",计算宽;

android:orientation="vertical"时,计算高。

例:子view没设置权重时,那么子view的宽和高并不会变,但是LineraLayout的宽高会是最大宽和高乘以view的个数。

 

android:orientation

关联方法:setOrientation(int orientation)

属性说明:设置线性布局的布局方向。  

必须是下列常量值之一:

horizontal水平方向(默认)

vertical垂直方向

对应的全局属性资源符号是orienntation

 

android:weightSum

关联方法:setWeightSum(floa weightSum)

属性说明设置weight总和的最大值。如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。

必须是浮点值(float),如:1.2

也可以引用一个包含此类型值的资源格式:@[package:]type:name或主题属性(格式:?[package][type:]name)。

对应的全局属性资源符号是weightSum

 

配合子视图的layout_weight使用。

 

【继承自view.ViewGroupXML属性】

...

 

【继承自view.ViewXML属性】

...



0 0
原创粉丝点击