New UI-关于布局优化集锦
来源:互联网 发布:淘宝怎么来的 编辑:程序博客网 时间:2024/05/20 17:23
New UI-关于布局优化集锦
——转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途!
小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的
力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文
更加的详尽,帮到更多的人,O(∩_∩)O谢谢!
小猪Android开发交流群:小猪Android开发交流群群号:421858269
新Android UI实例大全目录:http://blog.csdn.net/coder_pig/article/details/42145907
本节引言:
前面已经介绍了三个与布局优化有关的三个标签:include,ViewStub,merge;
相信大家对布局优化有了一些认识,在这一章节的最后一节里,我们就来唠叨唠叨
关于布局优化的一些建议!大家在实际开发中可以参考下,从而制作出更高效,
复用性更高的布局UI,好了废话就到这里,开始本节的内容吧!
本节正文:
1.布局优先考虑RelativeLayout:
①在规划最外层的布局的时候,我们优先考虑RelativeLayout,坚决不使用AbsoluteLayout
(当然基本上没人会这样做),要么RelativeLayout要么LinearLayout!
②在布局层次相同的情况下,就是线性布局与相对布局层次一样的时候,建议使用LinearLayout,因为
前者的性能比RelativeLayout的性能要高!
③当布局比较复杂的时候,这个时候使用LinearLayout实现效果可能需要多重嵌套,而实现相同的效果,
RelativeLayout却仅仅需要一层,这种情况下用哪个好就不言而喻了吧!
ps:当然,根据不同的情况你可以用FrameLayout,TableLayout,GridLayout啦,按需使用~
2.用好三个布局优化的标签:
①多次复用的组件,抽取出来到一个布局文件上,通过include标签引入
②对于不常用,又可能会用到布局,又或者页面中东西太多,某些部分可以暂时不显示,等用户交互再加载,
从而提高页面加载速度,这个时候你可以用<ViewStub>
③对于有用到FrameLayout的布局可以考虑使用merge来替代,又或者include进来的布局,可以使用
merge作为最外面的标签,从而可以达到减少视图层次的目的!
3.内嵌时少用LinearLayout的weight属性:
当多层嵌套的时候,尽量少使用LinearLayout的weight权重属性,因为系统需要花费很多
系统资源,因为每一个子控件都需要被测量两次,在使用GridView,ListView等控件的时候,
这个问题更加严重,因为子控件会被重复创建,所以,当多层内嵌时尽量避免使用weight属性!
4.书写规范的优化:
对id,资源,以及通用资源的命名,尽量规范化,比如:
一个登陆的输入框:login_edit_username
一个添加的按钮:ic_add ...等等
当然,不一定使用上面这种写法,但是你必须有遵循一个规范
另外,还是建议给不同的控件设置不同的id!!!
5.提高控件的查找效率:
在前面的学习中,我们通过Hierarchy Viewer可以知道,当我们加载布局文件后,会生成一个以
PhoneWindow$DecorView为根节点的控件树,而我们在操作控件时,必须查找到对应的控件!
我们通常会在Activity的onCreate()中通过findViewById找到相应控件,然后对其进行初始化!
再执行相关操作,设置相关属性或者加事件监听等,而findViewById方法是从控件树的根节点开始
递归查找。由于树形结构的特殊性,我们可以根据控件树的特点来选择查找控件的策略,减少查找次数
优化查找路径!
①先查找外层:
比如一个LinearLayout布局,定义了多个Button控件,如:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/LinearLayout1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮1" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮2" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮3" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮4" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮5" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮6" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮7" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮8" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮9" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按钮10" />
- </LinearLayout>
如果需要初始化所有的Button,你会怎么写?大部分朋友可能会先为每个按钮设置一个id
直接这样写:
- Button btn1 = (Button) findViewById(R.id.btn1);
- Button btn2 = (Button) findViewById(R.id.btn2);
- Button btn3 = (Button) findViewById(R.id.btn3);
- Button btn4 = (Button) findViewById(R.id.btn4);
- Button btn5 = (Button) findViewById(R.id.btn5);
- Button btn6 = (Button) findViewById(R.id.btn6);
- Button btn7 = (Button) findViewById(R.id.btn7);
- Button btn8 = (Button) findViewById(R.id.btn8);
- Button btn9 = (Button) findViewById(R.id.btn9);
- Button btn10 = (Button) findViewById(R.id.btn10);
再对每个Button完成相关操作,但是机智的你肯定会发现,代码的重复的太高了,而且定义了很多变量
对于按钮这种东西,很多时候我们仅仅是为他设置一个点击事件而已,于是乎我们可以这样来查找控件:
找到外部LinearLayout的容器控件,然后调用getChildAt方法获得按钮控件,并完成初始化:
- ViewGroup parent = (ViewGroup)findViewById(R.id.parent);
- int count = parent.getChildCount();
- for(int i = 0;i < count;i++)
- {
- Button button = parent.getChildAt(i);
- //为Button执行相关操作
- }
明显后者的代码由于前者的代码,而且当子控件越多,控件树层次越多的时候,优势更加明显;
从改善后的代码,我们可以发现另外一个更加重要的原则:
再查找控件的时候,尽可能从远离控件最近的节点开始!
②从离控件最近的节点开始
要查找一个嵌套层次较深的布局中的一个控件,比如在有一个Button和TextView中三层
嵌套的LinearLayout中,要找这两个组件,你要怎么找呢?直接:
- Button btn = (Button)findViewById(R.id.btn);
- TextView txt = (TextView)findViewById(R.id.txt);
时候,这种方法会降低控件查找的性能,而对于这种情况,我们仅仅需要添加一行代码就可以进行
优化:
View parent = findViewById(R.id.parent); //找到控件所在的节点(前置容器)
在查找组件的前面添加这个语句,当控件数量很多的时候,他的优势就会很明显,而且有些情况下
都必须这样写,尽管不建议大家给不同的控件设置相同的id,但当使用ListView这样的空间的时候
就会一直这样做,而findViewById的查找策略是:查找到第一个与id匹配的控件就停止查找,所以
查找结果可能不是实际需要的空间,所以从靠近控件的节点开始,不但提高查找速度,而且还能
更加精确的查找到控件,当然,还是建议大家给不同的控件设置不同的id值!!!
---第五点内容摘自:http://www.devdiv.com
最后说几句:
关于布局优化的东西,肯定不止上面这些,限于笔者水平,现在知道的就这些,以后有什么新
学到的东西一定分享给大家,另外关于ListView等控件优化的就不在这篇东西里面进行
阐述了,可见listView章节的内容!谢谢~
- New UI-关于布局优化集锦
- UI的布局优化
- Android UI布局优化
- New UI-<ViewStub>标签延时加载布局
- New UI-纯Java代码加载布局
- 代码优化之UI布局
- 浅谈android布局UI优化
- new UI-布局之LinearLayout(线性布局)详解
- New UI-布局之LinearLayout(线性布局)详解
- New UI-布局之RelativeLayout(相对布局)详解
- New UI-布局之TableLayout(表格布局)详解
- New UI-布局之FrameLayout(帧布局)详解
- New UI-布局之GridLayout(网格布局)详解
- 关于Android 布局优化
- 关于android UI布局自适应
- 【UI布局优化】Hierarchy Viewer-优化你的UI
- 【UI布局优化】Hierarchy Viewer-优化你的UI
- 【UI布局优化】Android布局优化的几种方式
- New UI-DroidDraw工具设计Android界面
- New UI-Hierarchy Viewer工具解析app的界面布局
- android自定义背景shape使用
- New UI-<ViewStub>标签延时加载布局
- New UI-<merge>标签减少视图层级,让布局更高效
- New UI-关于布局优化集锦
- 小猪的Android入门之路——目录(持续更新)
- New UI-纯Java代码加载布局
- New UI-Java代码动态添加控件或xml布局
- New UI-带边框的TextView
- New UI-带阴影的TextView
- 2015年,Facebook排名前5的开源项目
- 第四篇文章
- oracle EM证书错误ssl_error_weak_server_cert_key