Android布局优化
2015-11-09 09:36
295 查看
今天学习了几种android中简单的布局优化。
Android布局原则:
(1)尽量多使用LinearLayout(线性布局)和RelativeLayout(相对布局),不要使用AbsoluteLayout(绝对布局)。
(2)在布局层次一样的情况下,建议使用LinearLayout代替RelativeLayout,因为LinearLayout性能要稍微高一点。
(3)将可复用的组件抽取出来并通过include标签使用。
(4)使用ViewStub标签来加载一些不常用的布局。
(5)使用merge标签减少布局的嵌套层次。
1. include的使用
作用:将共用的组件抽取出来单独防盗一个xml文件中,然后使用include标签导入共用布局。
效果:提高UI的制作和复用效率,也能保证制作的UI布局更加规整和易于维护。
先把测试文件的activity设置为
android:theme="@android:style/Theme.Light.NoTitleBar"去掉标题栏。
新建一个layout取名为content_title:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
在activity_main中引用上面layout文件:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
在MainActivity.java中是可以直接拿到TextView的id的,来在MainActivity中试图改下标题名称。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
运行结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
当然我们还可以为其他的TextView设置点击事件,这里即使是用include标签引用进来的layout,在activity中还是可以直接获取到的,也可以为空间设置各种点击事件啥的。这样就提高了UI的灵活性以及性能。
2. 使用merge合并UI布局
作用:合并UI布局,使用该标签能降低UI布局的嵌套层次
场景(1):布局根节点是FrameLayout且不需要设置background或padding等属性,可以用merge代替。
场景(2):某布局作为子布局被其他布局include时,使用merge当做该布局的顶节点。这样在被引入时顶结点会自动被忽略。
新建一个layout取名为content_progress:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
在main_activity中添加:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
merge 差不多的作用就相当于FrameLayout,消除多余的FrameLayout以达到优化布局的作用。
总结merge:
(1)
merge标签中的子集是直接加到Activity的FrameLayout根节点下,(Activity视图的根节点都是frameLayout)。如果你所创建的Layout并不是用framLayout作为根节点(而是应用LinerLayout等定义root标签),就不能通过merge来优化UI结构。
(2)当应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。
(3)只可以作为xml
layout的根节点。
(4)当需要扩充的xml
layout本身是由merge作为根节点的话,需要将被导入的xml layout置于
viewGroup中,同时需要设置attachToRoot为True。
3. 使用ViewStub惰性加载
作用:ViewStub标签同include标签一样可以用来引入一个外部布局,不同的是,ViewStub引入的布局默认不会扩张,既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
新建一个layout取名为content_text,在里面就添加一个TextView:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="隐藏的内容" />
在main_activity中添加:
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示隐藏内容" />
android:id="@+id/stub"
android:layout="@layout/content_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
然后MainActivity中:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
运行结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
点击显示隐藏内容:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
隐藏的内容就显示出来了。
注意:
1.
ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
2.
ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
Android布局原则:
(1)尽量多使用LinearLayout(线性布局)和RelativeLayout(相对布局),不要使用AbsoluteLayout(绝对布局)。
(2)在布局层次一样的情况下,建议使用LinearLayout代替RelativeLayout,因为LinearLayout性能要稍微高一点。
(3)将可复用的组件抽取出来并通过include标签使用。
(4)使用ViewStub标签来加载一些不常用的布局。
(5)使用merge标签减少布局的嵌套层次。
1. include的使用
作用:将共用的组件抽取出来单独防盗一个xml文件中,然后使用include标签导入共用布局。
效果:提高UI的制作和复用效率,也能保证制作的UI布局更加规整和易于维护。
先把测试文件的activity设置为
android:theme="@android:style/Theme.Light.NoTitleBar"去掉标题栏。
新建一个layout取名为content_title:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
在activity_main中引用上面layout文件:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
在MainActivity.java中是可以直接拿到TextView的id的,来在MainActivity中试图改下标题名称。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
运行结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
当然我们还可以为其他的TextView设置点击事件,这里即使是用include标签引用进来的layout,在activity中还是可以直接获取到的,也可以为空间设置各种点击事件啥的。这样就提高了UI的灵活性以及性能。
2. 使用merge合并UI布局
作用:合并UI布局,使用该标签能降低UI布局的嵌套层次
场景(1):布局根节点是FrameLayout且不需要设置background或padding等属性,可以用merge代替。
场景(2):某布局作为子布局被其他布局include时,使用merge当做该布局的顶节点。这样在被引入时顶结点会自动被忽略。
新建一个layout取名为content_progress:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
在main_activity中添加:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
merge 差不多的作用就相当于FrameLayout,消除多余的FrameLayout以达到优化布局的作用。
总结merge:
(1)
merge标签中的子集是直接加到Activity的FrameLayout根节点下,(Activity视图的根节点都是frameLayout)。如果你所创建的Layout并不是用framLayout作为根节点(而是应用LinerLayout等定义root标签),就不能通过merge来优化UI结构。
(2)当应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。
(3)只可以作为xml
layout的根节点。
(4)当需要扩充的xml
layout本身是由merge作为根节点的话,需要将被导入的xml layout置于
viewGroup中,同时需要设置attachToRoot为True。
3. 使用ViewStub惰性加载
作用:ViewStub标签同include标签一样可以用来引入一个外部布局,不同的是,ViewStub引入的布局默认不会扩张,既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
新建一个layout取名为content_text,在里面就添加一个TextView:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="隐藏的内容" />
在main_activity中添加:
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示隐藏内容" />
android:id="@+id/stub"
android:layout="@layout/content_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
然后MainActivity中:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
运行结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
点击显示隐藏内容:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
隐藏的内容就显示出来了。
注意:
1.
ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
2.
ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
相关文章推荐
- Android学习路线指南
- Android自定义Animation动画
- Android studio教程:[4]真机测试
- Android 系统语言设置
- Android中View的绘制过程
- android studio 新建工程时提示资源文件出错
- Android之倒计时实现
- Android学习总结2
- android 中View的优化
- Android图片加载神器之Fresco-圆形圆角二合一教程[Java代码实现圆形圆角效果]
- Android Animation之补间动画
- 关于下拉刷新你是否真的非常理解还是只会搬砖?附 Android 实例子源代码文件下载地址380个合集
- android88 录音机
- android打开各种文件setDateAndType
- Android 下删除手机呼叫记录的两种方法:
- AndroidScreenSlide项目切换view动画效果《IT蓝豹》
- 选择蜂窝Android培训 我的薪资过万了
- android文件存储的五种方式简介
- 《Android开发艺术探索》读后笔记1
- android87 Service