Layout
- LinearLayout(线性布局)最常用的布局方式,垂直或横向布局。可以使用weight属性控制每个视图的相对宽度
- FrameLayout(单帧布局)最简单的布局,把新的视图堆放在前一个视图的上面,之前的视图会被遮盖。默认的位置市左上角,不过可以使用gravity属性来改变位置。
- RelativeLayout(相对布局)可以根据边界位置设置每个视图显示的位置。
- GridLayout(表格布局)在android 4.0(API level 14)中被引入的一种布局方式,GridLayout及其灵活,可以显著的简化布局,而且可以减轻或者消除在使用前叙布局构建UI时经常需要复杂的嵌套。
优化布局
一个Frame布局内部的LinearLayout,两者都被设置为match_parent,这样做没有什么实际的意义,只是增加了填充他们的时间。
布局虽然可以任意的嵌套,所以很容易创建出复杂而深嵌套层次结构,虽然没有严格的限制,但最好控制在10层以内。
当出现冗余的嵌套时,最好使用merge标签分割出另一个文件,然后使用include标签把布局插入进来。merge标签在被添加到另一个布局文件中时会删除merge节点,包裹内部的内容到另一个布局中去。
使用merge和include标签可以创建灵活的、可复用的布局定义。<include layout=“@layout/xxx” />
避免使用过多的View
填充每个额外的View都需要花费时间和资源,为了最大限度提高应用程序的速度和响应能力,布局包含的View应该不超过80个,如果超过这个限制,填充布局花费的时间将会成为一个显著的问题。
想要在复杂的布局内填充的View的数量最少,可以使用ViewStub。
View Stub的工作原理就像市一个延迟填充的include标签,一个stub代表了在父布局中指定的(多个)子View,但只有显示的调用inflate()方法或被置为可见的时候,这个stub才会被填充。
// 查找 Stub
View stub = findViewById(R.id.listview_stub);
// 将其设置为可见,以填充布局
stub.setVisibility(View.VISIBLE);
// 查找已填充的 stub 布局的根节点
View downloadProgessPanel = findViewById(R.id.listview);