Android UI優(yōu)化 ViewStub按需加載

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容