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,好了废话就到这里,开始本节的内容吧!
本节正文:
①在规划最外层的布局的时候,我们优先考虑RelativeLayout,坚决不使用AbsoluteLayout
(当然基本上没人会这样做),要么RelativeLayout要么LinearLayout!
②在布局层次相同的情况下,就是线性布局与相对布局层次一样的时候,建议使用LinearLayout,因为
前者的性能比RelativeLayout的性能要高!
③当布局比较复杂的时候,这个时候使用LinearLayout实现效果可能需要多重嵌套,而实现相同的效果,
RelativeLayout却仅仅需要一层,这种情况下用哪个好就不言而喻了吧!
ps:当然,根据不同的情况你可以用FrameLayout,TableLayout,GridLayout啦,按需使用~
①多次复用的组件,抽取出来到一个布局文件上,通过include标签引入
②对于不常用,又可能会用到布局,又或者页面中东西太多,某些部分可以暂时不显示,等用户交互再加载,
从而提高页面加载速度,这个时候你可以用<ViewStub>
③对于有用到FrameLayout的布局可以考虑使用merge来替代,又或者include进来的布局,可以使用
merge作为最外面的标签,从而可以达到减少视图层次的目的!
当多层嵌套的时候,尽量少使用LinearLayout的weight权重属性,因为系统需要花费很多
系统资源,因为每一个子控件都需要被测量两次,在使用GridView,ListView等控件的时候,
这个问题更加严重,因为子控件会被重复创建,所以,当多层内嵌时尽量避免使用weight属性!
对id,资源,以及通用资源的命名,尽量规范化,比如:
一个登陆的输入框:login_edit_username
一个添加的按钮:ic_add ...等等
当然,不一定使用上面这种写法,但是你必须有遵循一个规范
另外,还是建议给不同的控件设置不同的id!!!
在前面的学习中,我们通过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章节的内容!谢谢~
原文地址:http://blog.csdn.net/coder_pig/article/details/43317619