背景
最近剛好有看到ViewStub,是以根據個人了解記錄下筆記。
ViewStub是Android布局優化的方式之一。
它可以讓部分布局延遲加載,進而提高頁面渲染速度。
場景
因為ViewStub是用于延遲加載使用,是以适用場景是一些不需要即時展示的頁面。
舉個例子,大家都用過登入頁面。
假設第一次你輸入登入使用者名和密碼錯誤時,第二次輸入會要求你輸入驗證碼。
這裡的驗證碼第一次渲染頁面時不需要顯示,是以可以适用延遲加載場景。
而像使用者名和密碼輸入框因為第一次顯示的時候就要求展示在頁面上,是以不适合使用ViewStub。
ViewStub和android:visibility="gone"差別
可能大家會好奇,如果ViewStub的作用是延遲加載。
那麼如果我把要延遲加載的布局visibility設定為gone不是一樣的效果嗎?
表面上看起來效果是一樣的,但是差別在哪呢?
設定某個布局子產品為gone,但是系統在渲染該布局時還是會去計算這個布局子產品的寬高等屬性,還是會把它添加到布局樹上。是以這個布局子產品還是會占有渲染布局的部分時間。
而把該布局子產品放在ViewStub,系統在渲染該布局時并不會去理ViewStub節點,是以可以節省渲染布局子產品的時間。隻有當需要展示時,才會去渲染。
ViewStub使用
正如我們之前所說的,ViewStub下的布局是不會展示的。
那麼怎麼讓它展示呢?
-
獲得ViewStub元件。
跟其他元件一樣通過findViewById(R.id.view_stub)獲得mViewStub;
-
顯示。
有兩種方式:
- 直接調用
mViewStub.setVisibility(View.VISIBLE);
- 通過inflate
mStubView = mViewStub.inflate();
兩種方式的差別在于通過inflate可以傳回引用的布局View,可以通過該引用獲得布局View的其他元件。
NOTE
inflate隻能調用一次,不能調用多次,否則會報錯。
因為設定ViewStub可見後,ViewStub就不複存在了。
具體示例Demo可以看
github Demo。