利用ViewStub實現布局懶惰載入

2022-02-26 11:16:14 字數 2171 閱讀 8166

這個問題也是頭條面試官問的,本身沒什麼難度,但以前確實沒仔細研究過。

viewstub是一種不可見的尺寸為0的view,用來實現布局資源的懶載入。當viewstub被設定為使用者可見或其  inflate() 被呼叫時,實際的布局資源才會被載入。這時viewstub在view樹中的位置會被新載入的view取代,並且新載入的view會繼承viewstub所擁有的布局引數。而且我們還可以通過viewstub的 inflatedid 屬性定義新載入view的控制項id。

此時viewstub可以通過「stub」這個id獲取到,在「mysubtree」指向的布局被載入之後,viewstub會被從view樹中移出,「mystubtree」指向的布局便可以通過「subtree」這個id獲取到。新載入的布局會繼承viewstub的布局引數,在這裡就是寬120dip,高40dip。利用stubview載入布局的方式如下:

viewstub stub = findviewbyid(r.id.stub);

view inflated = stub.inflate();

當inflate() 

被呼叫以後,viewstub被新載入的view取代。通過這種方式應用可以直接獲取到新載入的view而無需再次呼叫

findviewbyid()

翻譯的可能不是太準確,有興趣的朋友可以看原文:stubview

顯然,我們需要關注的函式是viewstub的 inflate() 。這個函式在使用的時候有乙個需要注意的地方就是它只能被呼叫一次,至於為什麼可以在原始碼中找到答案。

public view inflate()  else 

// 載入布局並例項化。

final view view = factory.inflate(mlayoutresource, parent,

false);

// 此處stubview將自己的inflatedid屬性的值設定給了新載入的view。

if (minflatedid != no_id)

// 緊接著stubview將自己從父view中移出。

final int index = parent.indexofchild(this);

parent.removeviewinlayout(this);

// 將自己的layoutparams設定給新載入的view,這就是為什麼新載入的view會

// 繼承viewstub的布局引數。

final viewgroup.layoutparams layoutparams = getlayoutparams();

// 將新載入的view新增到父view中,而且是自己原來的位置。

if (layoutparams != null) else

// 儲存新載入的view的弱引用。

minflatedviewref = new weakreference(view);

if (minflatelistener != null)

return view;

} else

} else

}

在函式的第26行可以看到,viewstub將自己從父view中移除,所以如果再次呼叫 inflate() ,第5行的判斷不成立就會丟擲異常。在第37行,viewstub儲存了新載入的view的弱引用,為什麼還要儲存這個引用呢?這是因為在呼叫了 inflate() 之後,仍可以使用stubview的 setvisibility() 來設定新載入view的可見性。

public void setvisibility(int visibility)  else 

} else

}}

如果之前已將呼叫了 inflate() 那麼 minflatedviewref 肯定不為 null

,否則如果引數為 visible 或 invisible 的話, inflate() 函式就會被呼叫。

viewstub如何提高我們的載入效能:

在它的初始化函式中,使用了 setvisibility(gone) ,我們知道,可見性為 gone 的view是不會被繪製且不占用空間的。

與直接將目標控制項的可見性設定為 gone 相比它的優勢:

即使將可見性設定為 gone ,在載入布局時仍需要對控制項進行初始化等操作。這時viewstub則顯得十分輕量。

Android布局優化之ViewStub的使用

最近剛好有看到viewstub,因此根據個人理解記錄下筆記。viewstub是android布局優化的方式之一。它可以讓部分布局延遲載入,從而提高頁面渲染速度。因為viewstub是用於延遲載入使用,因此適用場景是一些不需要即時展示的頁面。舉個例子,大家都用過登入頁面。假設第一次你輸入登入使用者名稱...

安卓布局優化 ViewStub使用

在開發中很多時候回遇到這種情況,我們在一般情況下不需要在介面上顯示那麼多控制項,但是這些控制項在特殊情況下又是需要被顯示的,此時viewstub就派上用場了,話不多說,直接 講解 首先我們定義乙個布局 就是那個時而隱藏時而顯示的布局啦 viewstub.xml 效果很簡單,就是三個垂直排列的輸入框。...

HTML CSS JS 瀑布流式布局(實現懶載入)

首先來說一下瀑布流的原理吧 瀑布流是許多資料塊組成的,可以是,可以是div,但是它們都有乙個特點,就是等寬不等高,正是因為它等寬不等高,所以如果按部就班的排布的話,才會出現很大的縫隙,特別不好看,說白了瀑布流布局就是充分利用之間的空隙來合理的布局,使布局看起來好看。首先上css布局 因為個人喜歡比較...