精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android使用ViewStub提高布局性能

移動開發 Android
在Android開發中,View是我們必須要接觸的用來展示的技術.通常情況下隨著View視圖的越來越復雜,整體布局的性能也會隨之下降.這里介紹一個在某些場景下提升布局性能的View,它就是ViewStub.

[[171874]]

在Android開發中,View是我們必須要接觸的用來展示的技術.通常情況下隨著View視圖的越來越復雜,整體布局的性能也會隨之下降.這里介紹一個在某些場景下提升布局性能的View,它就是ViewStub.

ViewStub是什么

  • ViewStub是View的子類
  • 它不可見,大小為0
  • 用來延遲加載布局資源

注,關于Stub的解釋

A stub is a small program routine that substitutes for a longer program, possibly to be loaded later or that is located remotely

在Java中,樁是指用來代替關聯代碼或者未實現代碼的代碼.

ViewStub使用場景

如上圖所示,

  • 一個ListView包含了諸如 新聞,商業,科技 等Item
  • 每個Item又包含了各自對應的子話題,
  • 但是子話題的View(藍色區域)只有在點擊展開按鈕才真正需要加載.
  • 如果默認加載子話題的View,則會造成內存的占用和CPU的消耗

所以,這時候就ViewStub就派上用處了.使用ViewStub可以延遲加載布局資源.

ViewStub 怎么用

1.在布局文件中使用ViewStub標簽

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <RelativeLayout 
  3.         xmlns:android="http://schemas.android.com/apk/res/android" 
  4.         xmlns:tools="http://schemas.android.com/tools" 
  5.         android:layout_width="match_parent" 
  6.         android:layout_height="match_parent" 
  7.         android:paddingLeft="@dimen/activity_horizontal_margin" 
  8.         android:paddingRight="@dimen/activity_horizontal_margin" 
  9.         android:paddingTop="@dimen/activity_vertical_margin" 
  10.         android:paddingBottom="@dimen/activity_vertical_margin" 
  11.         tools:context="com.droidyue.viewstubsample.MainActivity"> 
  12.  
  13.     <Button 
  14.             android:id="@+id/clickMe" 
  15.             android:text="Hello World!" 
  16.             android:layout_width="wrap_content" 
  17.             android:layout_height="wrap_content"/> 
  18.      
  19.     <ViewStub 
  20.             android:id="@+id/myViewStub" 
  21.             android:inflatedId="@+id/myInflatedViewId" 
  22.             android:layout="@layout/include_merge" 
  23.             android:layout_width="wrap_content" 
  24.             android:layout_height="wrap_content" 
  25.             android:layout_below="@id/clickMe" 
  26.     /> 
  27. </RelativeLayout> 

2.在代碼中inflate布局

  1. ViewStub myViewStub = (ViewStub)findViewById(R.id.myViewStub); 
  2. if (myViewStub != null) { 
  3.     myViewStub.inflate(); 
  4.     //或者是下面的形式加載 
  5.     //myViewStub.setVisibility(View.VISIBLE); 

關于ViewStub的事

  • 除了 inflate 方法外,我們還可以調用 setVisibility() 方法加載布局文件
  • 一旦加載布局完成后,ViewStub會從當前布局層級中刪除
  • android:id 指定ViewStub ID,用于查找ViewStub進行延遲加載
  • android:layout 延遲加載布局的資源id
  • android:inflatedId 加載的布局被重寫的id,這里為RelativeLayout的id

ViewStub的不足

官方的文檔中有這樣一段描述

Note: One drawback of ViewStub is that it doesn’t currently support the tag in the layouts to be inflated.

意思是ViewStub不支持 標簽.

關于不支持 標簽的程度,我們進行一個簡單的驗證

驗證一:直接 標簽

如下,我們有布局文件名為merge_layout.xml

  1. <merge xmlns:android="http://schemas.android.com/apk/res/android"> 
  2.  
  3.     <Button            android:layout_width="fill_parent" 
  4.             android:layout_height="wrap_content" 
  5.             android:text="Yes"/> 
  6.  
  7.     <Button            android:layout_width="fill_parent" 
  8.             android:layout_height="wrap_content" 
  9.             android:text="No"/> 
  10.  
  11. </merge> 

 

替換對應的ViewStub的android:layout屬性值之后,運行后(點擊Button按鈕)得到產生了如下的崩潰

  1. E AndroidRuntime: android.view.InflateException: Binary XML file line #1: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true 
  2. E AndroidRuntime:         at android.view.LayoutInflater.inflate(LayoutInflater.java:551) 
  3. E AndroidRuntime:         at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
  4. E AndroidRuntime:         at android.view.ViewStub.inflate(ViewStub.java:259) 
  5. E AndroidRuntime:         at com.droidyue.viewstubsample.MainActivity$1.onClick(MainActivity.java:20) 
  6. E AndroidRuntime:         at android.view.View.performClick(View.java:5697) 
  7. E AndroidRuntime:         at android.widget.TextView.performClick(TextView.java:10815) 
  8. E AndroidRuntime:         at android.view.View$PerformClick.run(View.java:22526) 
  9. E AndroidRuntime:         at android.os.Handler.handleCallback(Handler.java:739) 
  10. E AndroidRuntime:         at android.os.Handler.dispatchMessage(Handler.java:95) 
  11. E AndroidRuntime:         at android.os.Looper.loop(Looper.java:158) 
  12. E AndroidRuntime:         at android.app.ActivityThread.main(ActivityThread.java:7237) 
  13. E AndroidRuntime:         at java.lang.reflect.Method.invoke(Native Method) 
  14. E AndroidRuntime:         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
  15. E AndroidRuntime:         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
  16. E AndroidRuntime: Caused by: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true 
  17. E AndroidRuntime:         at android.view.LayoutInflater.inflate(LayoutInflater.java:491) 
  18. E AndroidRuntime:         ... 13 more 

可見,直接的 標簽,ViewStub是不支持的.

驗證二 間接的ViewStub

下面布局間接使用了merge標簽.文件名為 include_merge.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.               android:orientation="vertical" 
  4.               android:layout_width="match_parent" 
  5.               android:layout_height="match_parent"> 
  6.         <include layout="@layout/merge_layout"/> 
  7. </LinearLayout> 

 

然后修改ViewStub的 android:layout 值,運行,一切正常.

除此之外,本例也驗證了ViewStub也是對 標簽支持良好的.

關于ViewStub的一點代碼剖析

inflate vs setVisibility

inflate和setVisibility的共同點是都可以實現加載布局

  1. /**     * When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE}, 
  2.      * {@link #inflate()} is invoked and this StubbedView is replaced in its parent 
  3.      * by the inflated layout resource. 
  4.      * 
  5.      * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}. 
  6.      * 
  7.      * @see #inflate()  
  8.      */ 
  9.     @Override 
  10.     public void setVisibility(int visibility) { 
  11.         if (mInflatedViewRef != null) { 
  12.             View view = mInflatedViewRef.get(); 
  13.             if (view != null) { 
  14.                 view.setVisibility(visibility); 
  15.             } else { 
  16.                 throw new IllegalStateException("setVisibility called on un-referenced view"); 
  17.             } 
  18.         } else { 
  19.             super.setVisibility(visibility); 
  20.             if (visibility == VISIBLE || visibility == INVISIBLE) { 
  21.                 inflate(); 
  22.             } 
  23.         } 
  24.     } 

setVisibility只是在ViewStub***次延遲初始化時,并且visibility是非 GONE 時,調用了 inflate 方法.

inflate源碼

通過閱讀下面的inflate方法實現,我們將更加理解

  • android:inflatedId的用途
  • ViewStub在初始化后從視圖層級中移除
  • ViewStub的layoutParameters應用
  • mInflatedViewRef通過弱引用形式,建立ViewStub與加載的View的聯系.

 

  1. /**     * Inflates the layout resource identified by {@link #getLayoutResource()} 
  2.      * and replaces this StubbedView in its parent by the inflated layout resource. 
  3.      * 
  4.      * @return The inflated layout resource. 
  5.      * 
  6.      */ 
  7.     public View inflate() { 
  8.         final ViewParent viewParent = getParent(); 
  9.  
  10.         if (viewParent != null && viewParent instanceof ViewGroup) { 
  11.             if (mLayoutResource != 0) { 
  12.                 final ViewGroup parent = (ViewGroup) viewParent; 
  13.                 final LayoutInflater factory = LayoutInflater.from(mContext); 
  14.                 final View view = factory.inflate(mLayoutResource, parent, 
  15.                         false); 
  16.  
  17.                 if (mInflatedId != NO_ID) { 
  18.                     view.setId(mInflatedId); 
  19.                 } 
  20.  
  21.                 final int index = parent.indexOfChild(this); 
  22.                 parent.removeViewInLayout(this); 
  23.  
  24.                 final ViewGroup.LayoutParams layoutParams = getLayoutParams(); 
  25.                 if (layoutParams != null) { 
  26.                     parent.addView(view, index, layoutParams); 
  27.                 } else { 
  28.                     parent.addView(view, index); 
  29.                 } 
  30.  
  31.                 mInflatedViewRef = new WeakReference<View>(view); 
  32.  
  33.                 if (mInflateListener != null) { 
  34.                     mInflateListener.onInflate(this, view); 
  35.                 } 
  36.  
  37.                 return view; 
  38.             } else { 
  39.                 throw new IllegalArgumentException("ViewStub must have a valid layoutResource"); 
  40.             } 
  41.         } else { 
  42.             throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent"); 
  43.         } 
  44.     } 
責任編輯:趙寧寧 來源: 技術小黑屋
相關推薦

2013-01-08 16:05:23

Android開發布局ViewStub

2024-04-24 08:25:00

性能Android生命周期

2009-08-05 15:13:32

使用Cache提高AS

2013-01-08 13:46:58

Android開發ViewStub布局

2009-11-02 14:08:05

2022-05-30 10:28:04

FlatBuffer數據可視化

2020-07-13 13:00:24

CSS變量技巧

2020-08-28 10:22:26

前端布局效率

2011-04-11 14:56:09

Oracle性能

2021-07-14 14:06:06

CSS前端瀏覽器

2011-04-02 13:37:05

SQL Server 索引視圖

2011-07-08 17:49:38

WITH ASCTE

2018-07-19 15:57:46

ViewStub源碼方法

2009-04-14 14:53:06

C++Lambda函數多線程

2009-12-23 17:07:37

WPF性能

2011-05-24 15:15:12

mysql性能

2015-10-10 11:00:05

RubyRails性能

2017-12-29 15:16:28

2015-10-14 17:27:18

性能

2012-06-13 09:35:41

存儲虛擬化
點贊
收藏

51CTO技術棧公眾號

在线观看国产精品91| 欧美日韩综合视频| 成人av影视在线| 国产91精品一区| 成人看的视频| 精品国产网站在线观看| 欧美亚洲日本在线观看| av女优在线播放| 青娱乐国产盛宴| 五月激激激综合网色播| 欧美日韩视频在线观看一区二区三区| 日本黄xxxxxxxxx100| 午夜性色福利影院| 久久99久久精品| 57pao精品| 中文字幕av播放| 日韩mv欧美mv国产网站| 欧美一区二区日韩| 99视频精品免费| 多野结衣av一区| 亚洲色图欧洲色图婷婷| 欧美下载看逼逼| 亚洲爱爱综合网| 美腿丝袜在线亚洲一区| 8x拔播拔播x8国产精品| 欧美日韩在线观看免费| 美女久久久久| 亚洲成人黄色网| 国产无套精品一区二区三区| 91精品国产66| 色8久久人人97超碰香蕉987| 隔壁人妻偷人bd中字| 免费网站免费进入在线| 国产日韩欧美高清在线| 麻豆av一区二区| 欧美一区二区三区黄片| 国产福利视频一区二区三区| 国产日韩在线精品av| 久久久精品福利| 亚洲免费黄色| 97色在线视频观看| 久久免费精彩视频| 在线观看日韩| 欧美成在线视频| 黄色精品视频在线观看| 日韩成人激情| 北条麻妃久久精品| 欧美a在线播放| 日韩精品影视| 日韩在线小视频| 99成人在线观看| 在线观看亚洲大片短视频| 99久久婷婷国产综合精品首页 | 亚洲国产日韩欧美在线99| 天天操精品视频| 91精品福利观看| 69av一区二区三区| 两女双腿交缠激烈磨豆腐| 国产精久久一区二区| 91精品国产综合久久久蜜臀粉嫩| 天天看片天天操| gogo大尺度成人免费视频| 欧美高清激情brazzers| 亚洲国产午夜精品| 中文字幕日韩在线| 亚洲成人教育av| 亚洲av无码一区二区三区网址| 九九热hot精品视频在线播放| 亚洲成成品网站| 日本一区二区三区网站| 国产麻豆精品久久| 在线观看日韩www视频免费| av手机在线播放| 99精品电影| 欧美超级乱淫片喷水| 免费一级全黄少妇性色生活片| 一区久久精品| 欧美亚洲视频在线观看| 中文 欧美 日韩| 国产在线国偷精品免费看| 亚洲精品欧美日韩专区| 丁香六月色婷婷| 99re热视频精品| 日韩欧美第二区在线观看| 日本天堂在线观看| 亚洲一区二区三区不卡国产欧美| 看av免费毛片手机播放| 成人精品国产| 亚洲精品一区二区三区在线观看| 亚洲激情视频小说| 国产精品黑丝在线播放| 午夜精品一区二区三区视频免费看| 四虎精品永久在线| 国产在线视频不卡二| 一区二区三区日韩精品视频| 91精品国产99久久久久久红楼 | 日韩精品极品在线观看| 久久午夜精品视频| 激情综合视频| 国产精品欧美日韩久久| 亚洲AV无码一区二区三区性 | 极品在线视频| 欧美三级视频在线观看| 亚洲无人区码一码二码三码| 激情五月综合网| 欧美日本黄视频| 手机av免费观看| 国产成人精品一区二| 欧美一区免费视频| 黄色小说在线播放| 欧美日韩极品在线观看一区| 国产人妻人伦精品1国产丝袜| 日韩在线观看| 欧美中文在线观看| 精品国产va久久久久久久| 国产日韩欧美精品在线| 怡红院av亚洲一区二区三区h| 日韩深夜福利网站| 亚洲色在线视频| 日本特黄特色aaa大片免费| 老色鬼精品视频在线观看播放| 精品欧美一区二区三区久久久| 国产黄a三级三级三级av在线看 | 国产欧美日韩免费观看 | 7777在线视频| 日本精品网站| 亚洲女人被黑人巨大进入| 国产一级片免费| 国产精品18久久久久久vr| 一区二区欧美日韩| 91精品国产66| 国产小视频国产精品| 国产精品久久久久久99| 成人小视频在线观看| 秋霞在线一区二区| 成人av在线播放| 日韩最新在线视频| 久久久久久久久久亚洲| 在线观看日本视频| 26uuu欧美| 日日碰狠狠添天天爽超碰97| 卡一精品卡二卡三网站乱码| 久久久亚洲精选| 国产综合视频在线| 亚洲国产视频一区| 国产精品99久久久精品无码| 欧美成人tv| 91日韩久久| sm在线观看| 亚洲激情自拍图| 国产成人在线视频观看| 91美女精品福利| 一本大道熟女人妻中文字幕在线 | 免费观看日韩av| 日韩国产一区久久| 麻豆久久久久| 精品国产一区二区三区久久狼5月| 中文字幕一级片| 1区2区3区精品视频| 手机精品视频在线| 狠狠爱www人成狠狠爱综合网| 不卡一区二区三区视频| av老司机在线观看| 日韩精品在线免费观看| 69xxxx国产| 国产精品久久午夜| 日本亚洲一区二区三区| 激情欧美亚洲| 欧洲在线视频一区| 黄色成人在线观看网站| 欧美成人三级视频网站| 欧美一级在线免费观看 | 国产男女激情视频| 欧美日韩伦理在线免费| 91精品视频专区| 国产乱码在线| 亚洲免费一在线| 亚洲在线精品视频| 亚洲综合色网站| 手机免费看av| 国产在线精品免费| 欧美亚洲另类色图| 日本在线电影一区二区三区| 欧美性猛交xxxx乱大交蜜桃| a在线观看免费视频| 成人黄视频在线观看| 精品欧美黑人一区二区三区| 久久久久久久久久久久久久av| 精品视频在线一区| 日本电影亚洲天堂一区| 四虎影院中文字幕| 99re这里都是精品| 免费黄频在线观看| 99在线精品视频在线观看| 先锋影音一区二区三区| 亚洲欧洲国产精品一区| 国产精品69精品一区二区三区| 超碰在线观看免费| 精品无码久久久久久国产| 亚洲天堂中文在线| 亚洲va欧美va人人爽| 亚洲色成人网站www永久四虎| 国产乱人伦精品一区二区在线观看| 成人免费观看cn| 婷婷伊人综合| 日韩电影免费观看在| 大桥未久女教师av一区二区| 国产精品女人久久久久久| 久久青草伊人| 欧美日韩成人在线播放| 97在线观看免费观看高清 | 三级男人添奶爽爽爽视频 | 欧美在线|欧美| 久久久久亚洲av片无码下载蜜桃 | 欧美国产欧美亚州国产日韩mv天天看完整 | 青青色在线视频| 日韩一区二区高清| 中文资源在线播放| 色偷偷成人一区二区三区91| 精品无码免费视频| 亚洲色图一区二区| 久草福利资源在线| 久久久不卡网国产精品二区| 欧美丰满熟妇bbb久久久| 久久99国产精品免费网站| 日本中文字幕片| 一本久道综合久久精品| 大地资源网在线观看免费官网| 日本精品黄色| 青青草成人网| 欧美激情在线精品一区二区三区| 国产精品美女久久久久av福利| 久久视频社区| 91美女福利视频高清| 国产精品天堂蜜av在线播放| 国产精品成熟老女人| 桃花岛成人影院| 日产精品99久久久久久| 亚洲黄色网址| 欧洲美女7788成人免费视频| 咪咪网在线视频| 91精品国产99| 色吧亚洲日本| 97精品一区二区三区| 超碰在线资源| 性欧美办公室18xxxxhd| 第一福利在线视频| 午夜精品一区二区三区视频免费看| wwww在线观看免费视频| 国模视频一区二区| 日韩精品av| 日韩av免费看网站| yw.尤物在线精品视频| 国产精品久久久精品| 欧美三级电影网址| 国产精品美女无圣光视频| 国产综合色区在线观看| 国产成人精品优优av| 国产一区二区三区影视| 国产免费一区视频观看免费 | 女厕盗摄一区二区三区| 欧美专区日韩视频| 日韩高清成人| 国产日韩av高清| 日韩高清一区| 六月婷婷久久| 日韩精品诱惑一区?区三区| 最新黄色av网站| 亚洲国产精品第一区二区| 久久久免费视频网站| 青青青爽久久午夜综合久久午夜| 国产精品一区二区小说| 国产sm精品调教视频网站| 丰满大乳奶做爰ⅹxx视频| 国产欧美视频在线观看| 四虎精品免费视频| 婷婷夜色潮精品综合在线| 中文字幕日韩免费| 5566中文字幕一区二区电影 | 亚洲人成电影网站| 欧美成人三区| 久久久免费观看| 姬川优奈av一区二区在线电影| 国产精品吴梦梦| 97se亚洲| 台湾成人av| 亚洲午夜91| 三上悠亚av一区二区三区| 国产成人午夜精品影院观看视频 | wwwww在线观看| 久久久久99精品国产片| 黄色香蕉视频在线观看| 午夜精品一区二区三区免费视频| 中文天堂在线播放| 精品国产三级电影在线观看| 国产女人在线视频| 欧美黄色三级网站| 国产精品天堂蜜av在线播放| 国产精品久久久一区二区三区| 精品久久久中文字幕| 成年人深夜视频| 美女脱光内衣内裤视频久久影院| 精人妻一区二区三区| 国产精品久久久久久久浪潮网站| 国语对白一区二区| 欧美精品aⅴ在线视频| 视频二区在线| 欧美精品激情blacked18| 秋霞国产精品| 精品一区二区三区视频日产| 欧美不卡一区| 中文字幕中文在线| 久久精品亚洲一区二区三区浴池| 美女视频黄免费| 欧美日韩精品一二三区| 你懂得网站在线| 久久久久一本一区二区青青蜜月| 午夜精品久久久久久毛片| 免费在线观看一区二区| 在线成人h网| 日本成人xxx| 中文字幕一区二区不卡| 亚洲无码精品一区二区三区| 亚洲精品国产成人| 国产91足控脚交在线观看| 亚洲一区二区中文字幕| 久久综合成人| 亚洲免费一级视频| 国产欧美日韩三区| aaaaaa毛片| 日韩精品在线观看网站| yellow在线观看网址| 国产厕所精品在线观看| 午夜精品久久| 中文字幕人妻无码系列第三区| 国产精品每日更新在线播放网址| 久久精品视频2| 亚洲人成欧美中文字幕| 中文在线8资源库| 蜜桃成人在线| 久久久久久穴| 日本激情小视频| 在线精品亚洲一区二区不卡| 黄色大片在线看| 国产成人精品免费久久久久| 亚洲传媒在线| 日韩欧美黄色大片| 久久婷婷综合激情| 日韩精品在线一区二区三区| 亚洲午夜精品久久久久久性色| 久久野战av| 五月天亚洲综合小说网| 久久精品国产亚洲一区二区三区 | 性感美女久久精品| 午夜小视频在线播放| 日本aⅴ大伊香蕉精品视频| 少妇一区二区视频| 亚洲污视频在线观看| 成人免费一区二区三区在线观看| 国产丝袜在线视频| 久久91亚洲精品中文字幕| 国产精品香蕉| 红桃av在线播放| 中文字幕精品一区二区三区精品| 亚洲视频在线观看免费视频| 久久精品最新地址| 国产成人夜色高潮福利影视| 国产深夜男女无套内射| 久久久欧美精品sm网站| 在线观看日批视频| 久久中文字幕在线| 国产区精品视频在线观看豆花| 久久无码高潮喷水| 亚洲欧洲av色图| 人妻少妇精品无码专区久久| 国产91色在线|| 91精品国产91久久综合| 国产大尺度视频| 日本高清不卡aⅴ免费网站| 在线观看黄色av| 国产高清自拍99| 爽好久久久欧美精品| 一级片一级片一级片| 亚洲精品国精品久久99热一| 秋霞国产精品| 轻点好疼好大好爽视频| 久久久久久久久一| 国产成人精品一区二区无码呦| 91精品成人久久| 亚洲最新av| a级大片在线观看| 日韩欧美一级片| 免费观看成人性生生活片| 黄色成人在线免费观看| 国产亚洲婷婷免费| 精品国产黄色片| 国产精品久久久久久亚洲影视| 亚洲日本久久| 日本黄色片免费观看| 亚洲精品资源在线|