android中的惰性加載方式:ViewStub
來自: http://www.jcodecraeer.com//a/anzhuokaifa/androidkaifa/2014/0821/1658.html
大家都應知道<include>標簽,該標簽可以在布局文件中引用另外一個布局文件,并可以覆蓋被引用布局文件根節點所有與布局相關的屬性,也就是以android:layout開頭的屬性。通過<include>標簽可以將一個非常龐大的布局文件分解成若干個較小的布局文件,而且這些小的布局文件也可以被多次引用,從而達到一個重用的目的。
<include>標簽固然很好用,但有一個問題,就是布局文件中的控件并不一定在程序啟動時全都用到,有一些控件只在特定的情況下才會被使用到。例如,一個閱讀圖書的軟件只有在下載電子書時才需要顯示進度條,在平時看書時都是裝載的本地電子書,并不需要使用進度條。因此,在程序啟動時完全可以先不加載這個進度條。但使用<include>標簽引用這個包含進度條的布局文件時,不管三七二十一,將所有的控件全部裝載到了內存中。也許有的讀者會說,一個進度條占用不了多少系統資源,都裝載也無所謂。這些讀者也許是對的,但如果裝載的不是進度條,而是很多ImageView控件(顯示了很大的圖像),并且還不是在一個地方裝載,那恐怕就會將可憐的手機資源消耗殆盡了。因此,我們急需一種機制來改變<include>標簽的這種行為,只在需要時裝載控件。這種機制就是本節要介紹的ViewStub控件。
ViewStub是不可視的控件,它的作用與<include>標簽基本相同,在布局文件中使用<ViewStub>標簽來引用其他的布局文件。但與<include>唯一的不同是ViewStub并不會馬上裝載引用的布局文件。只有在調用了ViewStub.inflate或ViewStub.setVisibility(View.VISIBLE)方法后,ViewStub才會裝載引用的控件。
ViewStub也不是萬能的,下面總結下ViewStub能做的事兒和什么時候該用ViewStub,什么時候該用可見性的控制。
首先來說說ViewStub的一些特點:
1. ViewStub只能Inflate一次,之后ViewStub對象會被置為空。按句話說,某個被ViewStub指定的布局被Inflate后,就不會夠再通過ViewStub來控制它了。
2. ViewStub只能用來Inflate一個布局文件,而不是某個具體的View,當然也可以把View寫在某個布局文件中。
在很多應用中,當用戶第一次進入會有一些由ImageView顯示的操作提示,每次用戶只能看一步提示,然后是下一步,這種場景下就很適合用ViewStub來實現。
最后,ViewStub的使用demo:
https://github.com/sodino/ViewStubDemo