界面布局优化
2015-07-13 14:24
1156 查看
android界面布局中,应该尽量减少层级,对于相同的代码,尽量做到复用,一般我们也会使用style对相同的属性进行提取。用include标签把相同的layout布局进行共用。但有时候,include会使我们增加不必要的层级,比如主布局中我们用Linearlayout来布局,orientation为vertical。这个时候,我们include了一个布局,布局也是Linearlayout,并且orientation也是vertical的,但其实include进来的Linearlayout其实是多余和无用的,那我们怎么去掉呢,使用merge标签即可解决。merge仅仅是把代码条件过来而不会增加层级,如下:
在主布局中,我们也是直接include即可。
另外一个标签,标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用标签,以减少内存使用量,加快渲染速度。是一个不可见的,大小为0的View。标签使用如下:
这里我们也加载了一个progress_overlay布局,默认是不加载的,当你需要的时候,在代码中调用:
当调用inflate()函数的时候,ViewStub被引用的资源替代,并且返回引用的view。需要注意的是inflate()方法只能调用一次。推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。
基于以上的特点,那么可以考虑使用ViewStub的情况有:
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/login_close" android:layout_width="@dimen/x100" android:layout_height="@dimen/x100" android:layout_marginLeft="@dimen/x10" android:layout_marginTop="@dimen/x10" android:src="@drawable/title_back" /> <ImageView android:layout_width="@dimen/x260" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="@dimen/y200" android:contentDescription="@string/icon" android:scaleType="fitCenter" android:src="@drawable/login_icon" /> </merge>
在主布局中,我们也是直接include即可。
另外一个标签,标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用标签,以减少内存使用量,加快渲染速度。是一个不可见的,大小为0的View。标签使用如下:
<ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import" android:layout="@layout/progress_overlay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" />
这里我们也加载了一个progress_overlay布局,默认是不加载的,当你需要的时候,在代码中调用:
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
当调用inflate()函数的时候,ViewStub被引用的资源替代,并且返回引用的view。需要注意的是inflate()方法只能调用一次。推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。
但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。 首先来说说ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。 2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
基于以上的特点,那么可以考虑使用ViewStub的情况有:
1. 在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。 因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。 2. 想要控制显示与隐藏的是一个布局文件,而非某个View。 因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。 所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。
相关文章推荐
- [LeetCode]Implement strStr() 字符串匹配
- 使用Spring Boot快速构建应用
- jQuery 遍历 - slice() 方法
- 后Hadoop时代的大数据架构(转)
- Codeforces 450 B. Jzzhu and Sequences
- SQL2008--行号的得到
- Android开发自定义popupwindow
- 上课笔记--财务管理
- Qt跨平台的一个例程
- Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance(info)
- 谈谈商城网站建设要优化的重点,包括图片优化!
- iOS判断是否有权限访问相机,相册,定位
- Visual Studio 调试小技巧(2) - 从查看窗口得到更多信息
- bzoj1079 dp
- 两张表关联,根据一张表更新另一张表
- 嵌入式Linux串口应用编程
- 2015年程序员生存报告,苦还是不苦
- c# TextBox 重绘边框
- C语言运算符优先级列表
- JavaScript slice() 方法