PART_A 布局
Android 中常用布局
- FrameLayout
- RelativeLayout
- LinearLayout
- AbsoluteLayout
- TableLayout & GrideLayout(Android 4.0 推出)
android:padding
& android:layout_margin
-
padding 是站在父 view 的角度描述问题,它规定控件自身内容与该控件 view 边界的距离
-
margin 则是站在自己的角度描述问题,规定自己和其他(上下左右)的 view 之间的距离. 如果同一级只有一个 view,那么它的效果基本上就和 padding 一样
android:layout_gravity
& android:gravity
第一个是让该布局在其父控件中的布局方式,第二个是该布局布置其子对象的布局方式
使用权重控制子控件的宽度为父控件1/3
可以在水平方向的 LinearLayout 中设置
weightSum
为 3,然后让其子控件的weight
为 1,那么该子控件就是父控件的 1/3
Android 中布局的优化措施
- 尽可能减少布局的嵌套层级
- 可以使用 sdk 提供的 hierarchyviewer 工具分析视图树,帮助我们发现没有用到的布局
-
不用设置不必要的背景,避免过度绘制. 比如父控件设置了背景色,子控件完全将父控件给覆盖的情况下,那么父控件就没有必要设置背景
-
使用
<include>
标签复用相同的布局代码 -
使用
<merge>
标签减少视图层次结构,该标签主要有两种用法- 因为所有的 Activity 视图的根节点都是 FrameLayout,因此如果我们的自定义的布局也是 FragmenLayout 的时候那么可以使用 merge 替换
- 当应用 Include 或者 ViewStub 标签从外部导入 xml 结构时,可以将被导入的 xml 用 merge 作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点
<merge>
只能作为 xml 布局的根元素
-
通过
<ViewStub>
实现 View 的延迟加载// 布局 <ViewStub android:id="@+id/vs" android:layout_height="0dp" android:inflatedId="@+id/my_view" android:layout="@layout/my_layout" />
// 核心代码: public void loadVS(View view){ ViewStub vs = (ViewStub) findViewById(R.id.vs); View inflate = vs.inflate(); int inflatedId = vs.getInflatedId(); int id = inflate.getId(); Toast.makeText(this, "inflatedId = " + inflatedId + "***" + "id = " + id, Toast.LENGTH_SHORT).show(); }
PART_B 屏幕适配