大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢
转载请标明出处(http://blog.csdn.net/kifile),再次感谢
原文地址:http://developer.android.com/training/improving-layouts/loading-ondemand.html
在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家
性能优化布局篇:
[Android 性能优化系列]布局篇之通过<include>复用布局
题外话:
很多时候我们都会在布局文件中加入一些不常使用的控件,但是我们又真的很少使用它们,但是它们在进行初始化的时候,一样会消耗我们的系统资源,因此我们应该考虑通过ViewStub来优化他,正如在内存篇中所说的那样,只在真正需要的时候使用它。
下面是本次的正文:
################
有时候,你的布局中会有一些比较复杂但是又很少用到的控件。不管他是消息详情,进度条还是未完成的提示信息,你都可以直到真正需要的时候再加载他们,以降低你的内存消耗,提升渲染效率。
定义一个ViewStub
ViewStub是一个没有任何尺寸的轻量级View,他不会在布局上绘制任何东西或者做其他的工作。这就意味着,初始化以及在布局层级中保留它只需要很少的花费。此外,请记住每一个ViewStub都需要包含一个android:layout属性来指明他将要显示布局
下面这个ViewStub制定了一个半透明的进度条,只有当应用中加入新的项时我们才能够被看到他:
<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" />
加载ViewStub的布局
当你想要加载ViewStub所指定的布局时,你可以选择性的使用setVisiblity(View.VISIBLE)或者调用inflate()方法。
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
注意:inflate()方法会返回初始化后的View,因此你不需要通过findViewById来查找这个View
一旦指定的布局显示出来或者说初始化完成,那么ViewStub元素就不再是布局层级中的一部分了,他会被所指定的布局所替换,而被指定布局的id则是在ViewStub的属性中通过android:inflatedId指定的(并且这个id仅当指定布局显示或者初始化完成后有效)
注意:ViewStub的一个缺点是,它不能够初始化<merge/>标签的布局文件
Ps:最近好懒且忙,所以一直没有更新东西。其实这篇文章半个月前都差不多翻译好了,但是觉得貌似很简单,就没有发出来,但想了想之后今天还是重新整理了一下文字,最终发了出来,布局篇本来应该还有一个关于ListView优化的部分,但是感觉大家其实一直都有用到,就直接在这个简单陈述一下他的思想就好了。ListView进行的优化主要在于getView时,布局的重用,以及使用ViewHolder保存需要使用的控件,避免每次使用时都要通过findViewById进行查找,详情我就不怎么说了,大家如果感兴趣,可以去官方地址看看: http://developer.android.com/training/improving-layouts/smooth-scrolling.html 。所以呢,布局篇就到这里了,感谢大家的阅览。