2.4.1 Android抽象布局
在布局优化中,Androi的官方提到了这三种布局<include />、<merge />、<ViewStub />
1、布局重用<include /> :该标签能够重用布局文件
1) 签必须使用单独的layout属性:<include layout="@layout/titlebar"/>
2) 可以使用其他属性。<include />标签若指定了ID属性,而会覆盖layout中的ID
3) 所有的android:layout_*都是有效的,前提是必须要写layout_width和layout_height两个属性。
4) 布局中可以包含两个相同的include标签,引用时可以使用如下方法解决(参考):
View bookmarks_container_2 = findViewById(R.id.bookmarks_favourite);
bookmarks_container_2.findViewById(R.id.bookmarks_list);
3、需要时使用<ViewStub />:2、减少视图层级<merge />:多用于替换FrameLayout
当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用<ViewStub />标签,以减少内存使用量,加快渲染速度。<ViewStub />是一个不可见的,大小为0的View。<ViewStub />标签使用如下:
<ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import" android:layout="@layout/progress_overlay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" /> 当你想加载布局时,可以使用下面其中一种方法: ((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE); // View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
当调用inflate()函数的时候,ViewStub被引用的资源替代,并且返回引用的view。 这样程序可以直接得到引用的view而不用再次调用函数findViewById()来查找了。注:ViewStub目前还不支持 <merge /> 标签。
2.4.2 Android六大布局
- FrameLayout: 层叠布局,在同一位置依次放置View,会盖住原来的东西。
- LinearLayout: 线性布局,可分为垂直布局("vertical")和水平布局("horizontal" )。
- AbsoluteLayout: 绝对布局,不建议使用。
- RelativeLayout: 相对布局,可以理解为某一个元素为参照物,有各种参照属性。
- TableLayout: 表格布局,每一个TableLayout里面TableRow,用来具体定义每一个元素。
- GridLayout: 网格布局,android4.0以上版本出现的。
GridLayout布局使用虚细线将布局划分为行、列和单元格,也支持一个控件在行、列上都有交错排列。而GridLayout使用的其实是跟LinearLayout类似的API,只不过是修改了一下相关的标签而已,GridLayout的布局策略简单分为以下三个部分:
首先它与LinearLayout布局一样,也分为水平和垂直两种方式,默认是水平布局,一个控件挨着一个控件从左到右依次排列,但是通过指定android:columnCount设置列数的属性后,控件会自动换行进行排列。
另一方面,对于GridLayout布局中的子控件,默认按照wrap_content的方式设置其显示,这只需要在GridLayout布局中显式声明即可。
其次,若要指定某控件显示在固定的行或列,只需设置该子控件的android:layout_row和android:layout_column属性即可,但是需要注意:android:layout_row=”0”表示从第一行开始,android:layout_column=”0”表示从第一列开始。
2.4.3 属性android:layout_weight
首先声明只有在Linearlayout中,该属性才有效。设置android:layout_width或android:layout_height为"0dp"和match_parent会造成两种截然相反的效果。它的原理是:按比例分配剩余空间!
- 当android:layout_width="0dp"时,在分配剩余空间阶段,比例按照layout_weight,也就是越大分得越大。
- 当android:layout_width="fill_parent"时,分配宽度能把所有空间分满,剩余的空间是负数,所以分配的越大,最终空间越小。