通過原始碼學習原始碼我們可以看到;
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...