使用延迟加载以及避免代码重复
创建复杂布局时,过多的控件将导致View树的层次越来越深,应用程序会越来越慢。优化布局是创建运行速度快,响应灵敏的应用程序的基础。
1:使用<include/>
标签避免代码重复
假设需要一个显示应用程序名的TextView,通常多个Activity对应的XML里面都会需要,加入我们挨个复制到每个布局文件中,以后想要修改这个TextView的话,将会是一件很麻烦的事情。解决这个问题最好的方法就是使用<include/>
标签。
Activity的布局文件为
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<include layout="@layout/footer"/>
footer的布局文件为:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="hello" >
但是对于同一个layout在不同布局中可能需要修改部分属性,那我们就想直接覆盖就行了,我们会发现此时<include/>
标签失效了,查看问题发现,必须要修改所指定的所有的android:layout_*
属性才可以生效。我们将footer中的部分属性修改如下:
android:layout_height="0dp"
android:layout_width="0dp"
这样在<include/>
标签中指定 layout_width
和 layout_height
属性。如果使用者不指定这两个属性,他们的属性值都是0,我们便看不到此页脚。
2:使用ViewStub实现View的延迟加载
设计布局的时候,我们往往需要根据实际情况显示视图。如果想要一个视图在需要的时候显示,可以直接用View.setVisibility()
来设置,考虑到性能因素的话Android为我们提供了ViewStub这个类。
“ViewStub是一种不可视并且大小为0的视图,可以延迟到运行时填充(inflate)布局资源,当ViewStub设置为可视或者inflate()方法被调用后,就会填充布局资源,然后ViewStub便会被填充的视图替代。”
<ViewStub
android:id="@+id/stub"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout="@layout/footer"
android:inflatedId="@+id/view_stub"
/>
在需要显示的时候使用findViewById(R.id.stub).setVisibility(View.VISIBLE);
即可改变ViewStub的可视性。
3:总结
<include/>
标签是整理布局的有效工具。
ViewStub是实现延迟加载视图的优秀类。无论在什么情况下,只要开发者需要根据上下文选择隐藏或者显示一个视图,都可以用ViewStub实现。或许并不会因为一个视图的延迟加载而感激到性能的明显提升,但是如果视图树的层次很深,便会感激到性能上的差距了。