ViewStub 學習筆記

2021-09-12 21:58:36 字數 1915 閱讀 8430

通過原始碼學習原始碼我們可以看到;

viewstub 的建構函式,

public viewstub(context context, attributeset attrs, int defstyleattr, int defstyleres)
viewstub是預設不顯示的

viewstub支援在程式執行的過程中通過懶載入的模式inflate布局資源中。只有當乙個viewstub的inflate()方法被呼叫或者被設為view.visibility時,此時viewstub會把設定的布局才會被建立對應的物件和例項化,並替換當前viewstub的位置,顯示相應的效果.

那我們先來看看setvisibility(int visibility)這個方法

@override

@android.view.remotableviewmethod(asyncimpl = "setvisibilityasync")

public void setvisibility(int visibility) else

} else

}}

這個判斷如果沒有存在view 的情況下最終還是會走inflate()方法,那我們再看一下inflate()這個方法

public view inflate()  else 

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

false);

if (minflatedid != no_id)

final int index = parent.indexofchild(this);

parent.removeviewinlayout(this);

final viewgroup.layoutparams layoutparams = getlayoutparams();

if (layoutparams != null) else

minflatedviewref = new weakreference(view);

if (minflatelistener != null)

return view;

} else

} else

}

通過**我們可以了解到viewstub 最終會替換成為在xml檔案裡面配置的layout引用的布局,並且把id替換為inflatedid.

關於viewstub 的使用例項:

<?xml version="1.0" encoding="utf-8"?>

<?xml version="1.0" encoding="utf-8"?>

public class viewstubtestactivity extends fragmentactivity 

}

補充:

1.viewstub inflate()方法只能呼叫一次

2.viewstub 的布局中不要有

3.removeviewinlayout()這個和removeview 的區別是 removeview會呼叫requestlayout 會觸發onlayout()而removeviewinlayout()方法一般在onlayout()方法裡面呼叫沒有requestlayout()更加安全

4.setwillnotdraw(false);這個方法原始碼注釋的意思:

如果此檢視本身不執行任何繪製,請設定此標誌以允許進一步優化。預設情況下,此標誌未在view上設定,但可以在某些view子類(如viewgroup)上設定。通常,如果重寫ondraw(canvas),則應清除此標誌。

所以使用的時候在構造方法裡面呼叫就可以了

ViewStub的原始碼

使用viewstub能夠實現view懶載入,就是viewstub本身的onmessure寬高為0和draw方法是空實現。只有在呼叫setvisible 或是呼叫inflate 方法的時候,才進行載入模組。在載入的過程中就是將viewstub的view刪除掉,然後將裡層的view新增到parent中,...

Android布局優化之ViewStub的使用

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

ViewStub你真的了解嗎

目錄介紹如果覺得好,可以star一下,謝謝!當然也歡迎提出建議,萬事起於忽微,量變引起質變!override android view.remotableviewmethod asyncimpl setvisibilityasync public void setvisibility int vis...