Android layout学习笔记

来源:互联网 发布:mac哑光液体大红 编辑:程序博客网 时间:2024/05/20 21:47

Layout(CommonLayout,Adapter Layout)


CommonLayout普通布局
布局视图(ViewGroup Android UI中的)

Common Layout一般布局
padding 内边距margin 外边距scrollbars 滚动条
1)RelativeLayout (相对布局)
特征:
1. 每个控件都可以使用其它控件作为参考点,从而决定自身的尺寸或者位置
2. 必须首先确定1个不以其它控件作为参考点,而是可以直接确定自身的尺寸和位置的控件
3. 当控件没有使用参考点控件时,默认以根布局作为参考点,且靠左对齐,靠上对齐
4. 相对布局中的子级布局控件可以重叠
属性:特有属性: align系列 --> 将控件设置为与相应控件的左右上下对齐
(没有)
to 系列 --> 将控件设置在相应控件的 上下左右
相对布局的子级控件的属性:
1. android:layout_alignParentLeft -> 对齐父级控件的左侧边缘,取值为true或者false
2. android:layout_alignParentRight -> 对齐父级控件的右侧边缘,取值同上
3. android:layout_alignParentTop -> 对齐父级控件的顶部边缘,取值同上
4. android:layout_alignParentBottom -> 对齐父级控件的底部边缘,取值同上
5. android:layout_centerHorizontal -> 在父级控件范围内水平方向居中对齐,取值同上
6. android:layout_centerVertical -> 在父级控件范围内容垂直方向居中对齐,取值同上
7. android:layout_centerInParent -> 在父级控件范围内水平方向和垂直方向均居中对齐,取值同上
8. android:layout_alignTop -> 与其它某个控件的顶部在垂直方向对齐,取值为其它控件的id
9. android:layout_alignBottom -> 与其它某个控件的底部在垂直方向对齐,取值同上
8. android:layout_alignLeft -> 与其它某个控件的左侧在水平方向对齐,取值同上
9. android:layout_alignRight -> 与其它某个控件的右侧在水平方向对齐,取值同上
10. android:layout_toLeftOf -> 设置控件在水平方向的位置在其它某个控件的左侧,取值为其它控件的id
11. android:layout_toRightOf -> 设置控件在水平方向的位置在其它某个控件的右侧,取值同上
12. android:layout_above -> 设置控件在垂直方向的位置在其它某个控件的上方,取值同上
13. android:layout_below -> 设置控件在垂直方向的位置在其它某个控件的下方,取值同上
Ps:
1. 当以其它控件作为参考点,其它控件必须与自身是同级(拥有相同的直接父级控件)控件
2. 不可以互相参考
1.RelativeLayout(相对布局)

定义的每个组件都相对与其它组件进行布局(也就说
每个组件都有一个相对位置),一般用于与比较复杂
的布局页面。

说明:
1)所有的布局对象在应用时要么在Activity中直
接new,要么定义在res/layout目录的xml文件中。
2)在使用所有的布局对象时需重点掌握的是布局
方式以及常用属性。

2)LinearLayout (线性布局)
特征:
1. 直接子级布局的控件按照代码的顺序先后排列
2. 直接子级布局的控件可以按照比例分配尺寸
属性:特有属性: weight --> 将宽(高)设置为0dp,则设置weight可按照比例进行分配空间
orientation --> 设置内部空间按垂直(水平)排布
android:orientation -> 布局方向,取值为vertical或者horizontal,前者表示子级布局的控件垂直方向(从上至下)排列,后者表示子级布局的控件水平方向(从左至右)排列
Ps:线性布局的直接子级布局的控件可以配置如下属性:
android:layout_weight -> 权重/比例,取值为整数
android:layout_gravity -> 对齐方式,取值为left、right、top、bottom、center,或者其中2个不冲突的值组合起来,例如top|left

3)GridLayout (网格布局)
android:layout_row=”0”表示从第一行开始,
android:layout_column=”0”表示从第一列开始
column --> 跨列
rowSpan --> 跨行
4)FrameLayout(帧布局)
5) AbsoluteLayout绝对布局
AbsoluteLayout绝对布局犹如div指定了absolute属性,用X,Y坐标来指定元素的位置!
6)......
2.Adapter Layout
1)ListView (列表视图)
2)GridView(网格视图)
3)Spinner(下拉列表)
4)ViewPager(视图分页)
5).......



Common Layout 优化

1.优化继承体系(减少层次结构)
例如:借助merge标签实现相同布局的合并
<merge/>标签在UI的结构优化中起着非常重要的作用,它可以删减多余的层级,优化UI。<merge/>多用于替换FrameLayout或者当一个布局包含另一个时,<merge/>标签消除视图层次结构中多余的视图组。例如你的主布局文件是垂直布局,引入了一个垂直布局的include,这是如果include布局使用的LinearLayout就没意义了,使用的话反而减慢你的UI表现。这时可以使用<merge/>标签优化。
meger运行程序后在Emulator中显示的效果是一样的,可是通过hierarchyviewer查看的UI结构是有变化的,当初多余的Layout节点被合并在一起了,或者可以理解为将merge标签中的子集直接加到Activity的Layout跟节点下(这里需要提醒大家注意:所有的Activity视图的根节点都是frameLayout)。如果你所创建的Layout并不是用framLayout作为根节点(而是应用LinerLayout等定义root标签),就不能应用上边的例子通过merge来优化UI结构。
除了上边的例子外,meger还有另外一个用法,当应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。
<merge />标签极其有用。然而它也有以下两个限制:
1.<merge />只能作为XML布局的根标签使用
2当需要扩充的xml layout本身是由merge作为根节点的话.(当Inflate以<merge />开头的布局文件时),必须指定一个父ViewGroup,并且必须设定attachToRoot为true(参看inflate(int, android.view.ViewGroup, Boolean)方法)。


2. 重用layout对象(include标签)
例如:借助include标签导入共用布局
include标签内不能设置RelativeLayout属性,如android:layout_alignParentBottom,因为不起作用
include标签内设置id属性后(android:id),其引用的布局layout内的id属性就不起作用了,怀疑是其引用的layout外层包裹了一层include标签
或者是覆盖了其内的属性id
why如果没有include标签,所有布局代码都写在一个xml文件中,界面会显得很冗余,可读性很差。而且界面加载的时候是按照顺序加载的,前面的布局不能
调用其后面的布局id。而采用include后,一个include中可以引用其后的include中的布局id属性
布局中可以包含两个相同的include标签,引用时可以使用如下方法解决(参考):
1. View bookmarks_container_2 = findViewById(R.id.bookmarks_favourite);
2.
3. bookmarks_container_2.findViewById(R.id.bookmarks_list);
3.实现对象的延迟加载(借助ViewStub)
<ViewStub />标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用<ViewStub />标签,以减少内存使用量,加快渲染速度。<ViewStub />是一个不可见的,大小为0的View。
ViewStub的一些特点:
1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
基于以上的特点,那么可以考虑使用ViewStub的情况有:
1. 在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。
因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。
2. 想要控制显示与隐藏的是一个布局文件,而非某个View。
因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。
所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。
当你想加载布局时,可以使用下面其中一种方法:
1. ((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
2. // or
3. View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

0 0
原创粉丝点击