ViewStub惰性裝載控件
定義
- ViewStub其實(shí)是<include/>標(biāo)簽的一個(gè)懶加載的優(yōu)化升級(jí),ViewStub是一個(gè)無形的、零大小的視圖,在程序運(yùn)行中,通過懶加載的模式inflate進(jìn)布局資源中。
- 當(dāng)ViewStub的inflate()或setVisibility(View. VISIBLE)時(shí),ViewStub使用設(shè)定的View才會(huì)加載,并替換當(dāng)前ViewStub的位置。ViewStub存在于視圖層次,直到setVisibility(int)或inflate()方法被調(diào)用,否則是不加載控件的,所以消耗的資源小,稱為懶加載Include。
- ViewStub的好處,在某些場(chǎng)景中,不需要把所有內(nèi)容展示,可隱藏大部分視圖,待需要展示時(shí)再加載到Layout中,這時(shí)用ViewStub,可減少資源的消耗,使最初的加載速度變快。
- ViewStub可以用于有大量視圖隱藏的界面的優(yōu)化
- 在ViewStub中,需要用到的屬性也就兩個(gè),Android也為其提供了相應(yīng)的getter/setter方法:
android:inflateId:重寫ViewStub的父布局控件的Id。
android:layout:設(shè)置ViewStub被inflate的布局控件Id。 - ViewStub需要監(jiān)聽的事件就只有VIewStub.OnInflateListener,被加載的時(shí)候觸發(fā),
該Listener需要實(shí)現(xiàn)一個(gè)onInflate()方法,onInflate(ViewStub stub, View inflated);
stub為當(dāng)前待加載的ViewStub控件,inflated參數(shù)為當(dāng)前被加載的View視圖,可以在其中對(duì)其進(jìn)行一些額外的操作。 - 特別注意:在使用ViewStub的過程中,對(duì)于ViewStub,當(dāng)setVisibility(int)或inflate()方法被調(diào)用之后,這個(gè)ViewStub在布局中將被使用指定的View替換,所以inflate過一遍的ViewStub,如果被隱藏之后再次想要顯示,將不能使用inflate()方法,但是可使用setVisibility(int)方法設(shè)置為可見。而inflate()被調(diào)用之后,返回的是父布局控件對(duì)象。
- ViewStub對(duì)象只可以Inflate一次,之后ViewStub對(duì)象會(huì)被置為空。inflate一個(gè)ViewStub對(duì)象之后,就不能再inflate它了,否則會(huì)報(bào)錯(cuò):ViewStub must have a non-null ViewGroup viewParent
- ViewStub不支持merge標(biāo)簽,意味著你不能引入包含merge標(biāo)簽的布局到ViewStub中。
否則會(huì)報(bào)錯(cuò):android.view.InflateException: Binary XML file line #1: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true