Android开发XML布局⽂件规范及建议
1 建议和案例
1.1 扁平化布局
解释:在Android加载XML布局⽂件,创建View或者ViewGroup的时候,XML⽂件的布局的深度和⼴度都会对这个过程造成影响。因此XML⽂件布局的深度和⼴度都会使创建View的过程更加的耗时,尤其是在布局⽂件多层嵌套的情况下,因此我们在进⾏布局的时候,应该尽量考虑使⽤扁平化的结构(⽽不是过多的⼀层套⼀层),减少布局的深度和复杂性。
建议1:能实现需求的前提下尽可能使⽤RelativeLayout代替LinearLayout。常见情况下我们会使⽤LinearLayout和RelativeLayout以及FrameLayout。LinearLayout需要多次进⾏测量布局操作,才能获取到正确的信息。RelativeLayout可以更加⽅便地实现⼀些LinearLayout需要进⾏嵌套才能实现的⼀些布局,这样对于实现布局的扁平化有更好的效果。案例:待补充
建议2:尽可能减少布局中不必要的控件的使⽤,以达到精简布局的效果。例如通过为TextView设置图⽚,来替换ImageView与TextView 的组合,实现同样的效果,⽽这样只使⽤了⼀个控件。例如使⽤HTML标签优化TextView显⽰。例如Android Spannable的使⽤等等。⼀句话,能使⽤⼀个简单控件实现的需求就尽可能不要使⽤多个。案例:待补充
1.2 Include标签的使⽤
解释:在应⽤的多个界⾯中,经常会有⼏个界⾯存在相同或者类似的部分,例如标题栏,导航栏之类的。这些重复的界⾯如果⼀⼀写下来,既浪费时间精⼒,⼜不⽅便统⼀管理,例如需要改动的时候,在这种情况下,可以把这个重复的界⾯布局独⽴出来,然后通过include标签,将这个布局导⼊需要引⽤的地⽅,这样就可以只维护这个独⽴出来的布局⽂件即可。
建议3:布局很复杂的时候可以将功能独⽴的部分使⽤include标签。
案例:使⽤include标签来写标题栏
注意:可以复写所有layout属性(任何android:layout_*属性),但是必须同时复写layout_width和 layout_height属性,这些复写的layout属性才会⽣效。可以在include标签中给这个布局定义⼀个id,这样将会覆盖其独⽴布局⽂件中的id值。
1.3 merge标签的使⽤
解释:merge标签可以⽤来代替布局⽂件中的根节点,例如LinearLayout,RelativeLayout,FrameLayout等元素。配合include标签,可以减少布局的嵌套。
建议4:使⽤merge标签来减少不必要的嵌套。
案例:include和merge配合使⽤
在使⽤include标签将上⾯布局复⽤的时候,会直接将两个Button放在include标签的位置,⽽不会使⽤其他容器来包装这两个button。
1.4 ViewStub的使⽤
解释:在实际应⽤中,可能存在⼀部分界⾯是处于隐藏状态的,在⼀定的条件下,才会展⽰出来。我们⼀般会将这部分节⽬使⽤setVisibility(View.GONE)⽅法将其隐藏起来,但是我们更推荐使⽤ViewStub来达到相同的⽬的。因为ViewStub是⼀个处于不可见状态的View,初始状态时不会被加载出来,不会浪费资源,⽽处于View.GONE状态的View也是需要被加载的。ViewStub的使⽤⽅法类似include 标签,需要在其中声明需要加载的布局⽂件。
建议5:在⼀定条件才会展⽰出来的⼀部分界⾯可使⽤ViewStub。
案例:播放详情页全屏界⾯使⽤ViewStub来实现各个模块界⾯。
在需要加载ViewStub这部分布局的时候,可以通过两种⽅式实现加载:
a) 通过setVisibility(View.VISIBLE)的⽅式,这时候可以通过判断其可见性来得知其是否已经加载。
b) 通过inflate⽅法来实现加载。注意此时⽆法通过判断可见性来判断是否已经加载了,可以通过判断其中的元素是否存在来判断加载情况。
1.5 ⾃定义View的使⽤
解释:当界⾯中某块布局⽐较复杂但⼜⽐较独⽴,这时我们就可以考虑将其封装成具体的⾃定义View。
建议6:适当的使⽤⾃定义View。案例:全屏播放的错误页⾯
1.6 Hierarchy Viewer⼯具
待补充
1.7 过度绘制检测
解释:屏幕上某⼀像素点在⼀帧中被重复绘制多次
分类(根据层度):
⽆过度绘制(⼀个像素只被绘制了⼀次) (原⾊)
过度绘制x1(⼀个像素被绘制了两次) (蓝⾊)
过度绘制x2(⼀个像素被绘制了三次) (绿⾊)
过度绘制x3(⼀个像素被绘制了四次) (粉⾊)
过度绘制x4+(⼀个像素被绘制了五次以上) (红⾊)
建议7:尽可能避免出现过度绘制。
案例:adb shell setprop debug.hwui.overdraw show
adb shell setprop debug.hwui.overdraw false
1.8 ConstaintLayout的使⽤
待补充
2 规范
2.1 图⽚资源⽂件(drawable\和mipmap\)
res/drawable/ ⽬录下放的是位图⽂件(.png、.9.png、.jpg、.gif)或编译为可绘制对象资源⼦类型的 XML ⽂件,⽽ res/mipmap/ ⽬录下放的是不同密度的启动图标,所以 res/mipmap/ 只⽤于存放启动图标,其余图⽚资源⽂件都应该放到 res/drawable/ ⽬录下。
命名规则:类型{_模块名}_逻辑名称、类型{_模块名}_颜⾊。
说明:{} 中的内容为可选;类型 可以是可绘制对象资源类型,也可以是控件类型(具体见附录UI 控件缩写表)。例如:
2.2 布局资源⽂件(layout\)
命名规则:类型_模块名、类型{_模块名}_逻辑名称。说明:{} 中的内容为可选。例如:
2.3 动画资源⽂件(anim/ 和 animator/)
安卓主要包含属性动画和视图动画,其视图动画包括补间动画和逐帧动画。属性动画⽂件需要放在 res/animator/ ⽬录下,视图动画⽂件需放在 res/anim/ ⽬录下。
命名规则:{模块名_}逻辑名称。说明:{} 中的内容为可选,逻辑名称 可由多个单词加下划线组成。
例如:l、market_l、market_l。
如果是普通的补间动画或者属性动画,可采⽤:动画类型_⽅向 的命名⽅式。例如:
2.4 values 资源⽂件(values/)
values/ 资源⽂件下的⽂件都以 s 结尾,如 l、l、l,起作⽤的不是⽂件名称,⽽是 标签下的各种标签,⽐如 style决定样式, 决定颜⾊,所以,可以把⼀个⼤的 xml ⽂件分割成多个⼩的⽂件,⽐如可以有多个 style ⽂件,如 l、l、styles_l、l。
注意:布局⽂件中如果要设置⼤⼩、颜⾊、字符串等禁⽌在布局⽂件中写死,⽽要在values/资源⽂件下定义对应的值。
a) l。
的 name 命名使⽤下划线命名法,在你的 l ⽂件中应该只是映射颜⾊的名称⼀个 ARGB 值,⽽没有其它的。不要使⽤它为不同
的按钮来定义 ARGB 值。例如,不要像下⾯这样做:
使⽤这种格式,会⾮常容易重复定义 ARGB 值,⽽且如果应⽤要改变基⾊的话会⾮常困难。同时,这些定义是跟⼀些环境关联起来的,如button 或者 comment,应该放到⼀个按钮风格中,⽽不是在 l ⽂件中。相反,应该这样做:
b) l
像对待 l ⼀样对待 l ⽂件,与定义颜⾊调⾊板⼀样,你同时也应该定义⼀个空隙间隔和字体⼤⼩的“调⾊板”。 ⼀个好的例⼦,如下所⽰:
布局时在写 margins 和 paddings 时,你应该使⽤ spacing_xx 尺⼨格式来布局,⽽不是像对待 string 字符串⼀样直接写值,像这样规范的尺⼨很容易修改或重构,会使应⽤所有⽤到的尺⼨⼀⽬了然。 这样写会⾮常有感觉,会使组织和改变风格或布局⾮常容易。
c) l
xml标签大全的 name 命名使⽤下划线命名法,采⽤以下规则:{模块名_}逻辑名称,这样⽅便同⼀个界⾯的所有 string 都放到⼀起,⽅便查。
d) l
style 的 name 命名使⽤⼤驼峰命名法,⼏乎每个项⽬都需要适当的使⽤ l ⽂件,因为对于⼀个视图来说,有⼀个重复的外观是很常见的,将所有的外观细节属性(colors、padding、font)放在 l ⽂件中。 在应⽤中对于⼤多数⽂本内容,最起码你应该有⼀个通⽤的 l ⽂件,例如:
3 附录
3.1 Xml配置参数⼤全
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论