您的位置:首页 > 其它

界面布局优化

2015-07-13 14:24 1156 查看
android界面布局中,应该尽量减少层级,对于相同的代码,尽量做到复用,一般我们也会使用style对相同的属性进行提取。用include标签把相同的layout布局进行共用。但有时候,include会使我们增加不必要的层级,比如主布局中我们用Linearlayout来布局,orientation为vertical。这个时候,我们include了一个布局,布局也是Linearlayout,并且orientation也是vertical的,但其实include进来的Linearlayout其实是多余和无用的,那我们怎么去掉呢,使用merge标签即可解决。merge仅仅是把代码条件过来而不会增加层级,如下:

<?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的可见性来控制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: