ViewStub相關(guān)知識

這兩天項(xiàng)目中遇到了關(guān)于viewstub相關(guān)的crash問題, 剛好可以把相關(guān)的知識復(fù)習(xí)一下.
ViewStub是View的子類, 是一種輕量級的view, 在android性能優(yōu)化中常常使用的到.

需要注意的地方

1) viewStub屬性

使用該控件時, 主要有兩個比較重要的屬性:

  1. android:layoutId:設(shè)置ViewStub被inflate的布局控件Id;
  1. android:layout: 填充進(jìn)viewStub的布局資源id;

2) viewStub特性

  1. 作為一種按需"延遲化加載"的控件,viewStub本身是不可見的,類似于"占位符"的性質(zhì),在inflate后會被指定的布局資源替換,ViewStub控件雖然也占據(jù)一定的內(nèi)存,但是相比較于其他控件, 所占用的內(nèi)存很小;
  2. 當(dāng)viewStub實(shí)例化之前, 調(diào)用setVisibility()也會間接調(diào)用inflate()進(jìn)行布局填充;
  3. android:layout屬性中指向的布局加載以后會替換掉viewstub本身,但是并不像Androidinclude標(biāo)簽一樣完全替代,viewStub的引用依然存在,并且可以通過viewstub的可視化操作控制view的顯示;

2) 重復(fù)inflate

viewstub只能初始化一次, 多次inflate會報(bào)

IllegalArgumentException("ViewStub must have a valid layoutResource");

異常, sourceCode如下:

[圖片上傳失敗...(image-4a814e-1552362786773)]

原因是由于調(diào)用了inflate之后viewstub就不在相關(guān)的布局中了, getParent()獲取不到父View的值了;當(dāng)然從代碼中可以看出包裹ViewStub的父控件也必須是ViewGroup的實(shí)現(xiàn)類才可以辣.

解決方案:引入一個boolean值標(biāo)識當(dāng)前viewStub是否已被初始化即可

private boolean isInflate = false;//標(biāo)記viewStub是否初始化,防止重復(fù)inflate,造成crash
mVrLoadingViewStub.setOnInflateListener(new ViewStub.OnInflateListener() {
            @Override public void onInflate(ViewStub stub, View inflated) {
              isInflate = true;
            }
          });
VrLoadingView mVrLoadingView;
if(!isInflate){
   mVrLoadingView = (VrLoadingView) mVrLoadingViewStub.inflate();
} else {
    mVrLoadingView = ((Activity) getContext()).findViewById(R.id.vr_loading_view);
}

ps:因?yàn)檫@里context一定是activity實(shí)例,所以不需要進(jìn)行擔(dān)心強(qiáng)轉(zhuǎn)失敗的問題;

3) 關(guān)于setvisibility

viewStub一經(jīng)實(shí)例化以后, 如果需要更改布局的顯示狀態(tài),可以通過viewstub.setvisibility()修改, 也可以通過設(shè)置的layoutId布局的setvisibility()方法, 替換布局文件的layout params以viewStub為準(zhǔn),如margin,padding等, 其他布局屬性以view自身為準(zhǔn);

4) viewstub的使用場景

一次加載的布局,且單個viewstub層級確實(shí)有性能資源方面的優(yōu)勢,但在如RecyclerView中使用viewStub的item view時,頁面加載極其緩慢,又或是層層嵌套的viewStub(結(jié)構(gòu)略復(fù)雜),打開一個頁面可能都要3秒左右;

處于此方面的考慮, 不建議高頻模塊使用,因?yàn)榉磸?fù)調(diào)用viewstub的inflate方法非常耗時;這種情況下建議采用include標(biāo)簽;

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

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

  • 數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個上限而已。 在數(shù)據(jù)建模前期,很重要的一步是特征工程的構(gòu)建,...
    神采奕奕的奕閱讀 1,697評論 0 0
  • 在現(xiàn)在這個黑暗時代,因?yàn)槊?,有多少人喪命天涯…?因?yàn)槊讶粊砼R,誰也無法抵抗,也無法控制,它的貪婪…… ...
    Dumbledore閱讀 316評論 0 1
  • 我要熱情的歌頌死亡 懷著無比愉悅的心情 慶賀那彼岸花的開放 說吧,罵吧,鄙視吧 我看透每一抹笑容下 隱藏著的悲觀與...
    敖湯閱讀 353評論 0 5
  • 一眼望不到邊 沒有河流 只有笨笨的石頭 和南方有所不同 堅(jiān)硬的駱駝刺耐得住寂寞 禿禿的光棍樹也從不修邊幅 遮天蔽日...
    劉少漢閱讀 226評論 0 1

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