Android使用ViewStub實(shí)現(xiàn)布局優(yōu)化方法示例
??實(shí)踐過(guò)程
Hello,大家好啊,我是小空,今天帶大家了解下動(dòng)態(tài)加載控件ViewStub。
在平時(shí)開(kāi)發(fā)中經(jīng)常會(huì)遇到復(fù)雜布局,而每一個(gè)view都是會(huì)占據(jù)內(nèi)存和消耗cpu的(即使再小,累計(jì)成多,一般嵌套7級(jí)以上就有明顯的卡頓了),布局優(yōu)化就是我們常做的任務(wù)之一,甚至是一塊心病。所以我們工作中就要留意布局優(yōu)化的手段,ViewStub就是其中之一。
大家應(yīng)該聽(tīng)過(guò)merge標(biāo)簽,將某個(gè)布局文件的根布局寫(xiě)成merge的,然后對(duì)應(yīng)的布局include引用,會(huì)默認(rèn)不會(huì)引入merge幫我們減少一層嵌套。而ViewStub也是類(lèi)似的實(shí)現(xiàn),區(qū)別在于include的merge就已經(jīng)在view的樹(shù)結(jié)構(gòu)中了,而viewstub默認(rèn)沒(méi)在樹(shù)中,只有代碼調(diào)用初始化的時(shí)候才會(huì)進(jìn)入樹(shù)中。
就好比我們排隊(duì),前者是兩人同時(shí)排隊(duì),后者是一個(gè)人排隊(duì)拿著個(gè)占位的牌子幫另一人占位,等合適的時(shí)機(jī)再將另一個(gè)人插入進(jìn)來(lái),牌子拿開(kāi)。
??實(shí)現(xiàn)方式
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/idBtnInflate" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="inflate" /> <ViewStub android:id="@+id/viewStubName" android:inflatedId="@+id/inflatedLayoutName" android:layout="@layout/yourLayout" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
布局中ViewStub其實(shí)就是個(gè)寬高全是0的View,它默認(rèn)是不可見(jiàn)的(不是GONE或INVISIBLE的不可見(jiàn),而是根本沒(méi)在view的樹(shù)結(jié)構(gòu)里),然后通過(guò)調(diào)用setVisibility函數(shù)或者Inflate函數(shù)會(huì)將我們的目標(biāo)布局給加載出來(lái),這樣就實(shí)現(xiàn)了延遲加載的效果。
idBtnInflate.setOnClickListener{ viewStubName. inflate() //或者是下面的形式加載,因?yàn)槔锩鏁?huì)執(zhí)行inflate // viewStubName.visibility=View.VISIBLE }
??知識(shí)點(diǎn)
注意,viewstub執(zhí)行inflate函數(shù)后,在當(dāng)前頁(yè)面activity未銷(xiāo)毀之前無(wú)法進(jìn)行第二次inflate。
為什么第二次inflate的時(shí)候會(huì)報(bào)錯(cuò)呢?仔細(xì)看上面列舉的排隊(duì)比喻,viewstud就是占位的那個(gè)牌子,當(dāng)你引入的layout插進(jìn)去后就會(huì)移除viewstub控件。那么下次你再進(jìn)行inflate的時(shí)候自然就是報(bào)錯(cuò)了。
為什么大小為0且不繪制? 我們找到ViewStub的源碼:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(0, 0); } @Override public void draw(Canvas canvas) { } @Override protected void dispatchDraw(Canvas canvas) { } public void setWillNotDraw(boolean willNotDraw) { setFlags(willNotDraw ? WILL_NOT_DRAW : 0, DRAW_MASK); }
重寫(xiě)draw和dispatchDraw,但卻什么也不寫(xiě),再接著onMeasure中進(jìn)行setMeasuredDimension(0,0);就實(shí)現(xiàn)了寬高為0.
而不繪制是將view的Flags設(shè)置為了WILL_NOT_DRAW,這個(gè)值的作用是view不會(huì)進(jìn)行onDraw方法。
順便一提:在當(dāng)下設(shè)備性能越來(lái)越好的背景下,關(guān)于優(yōu)化的事情放在開(kāi)發(fā)周期后面再說(shuō)吧。先出產(chǎn)品再迭代。隨著經(jīng)驗(yàn)的積累,正常開(kāi)發(fā)你也會(huì)留意性能優(yōu)化,隨手就解決了。
以上就是Android使用ViewStub實(shí)現(xiàn)布局優(yōu)化方法示例的詳細(xì)內(nèi)容,更多關(guān)于Android ViewStub布局優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flutter 包管理器和資源管理使用學(xué)習(xí)
這篇文章主要為大家介紹了Flutter 包管理器和資源管理使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android實(shí)現(xiàn)本地圖片選擇及預(yù)覽縮放效果
這篇文章主要為大家詳細(xì)介紹了Android仿春雨醫(yī)生,實(shí)現(xiàn)本地圖片選擇及預(yù)覽縮放效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android實(shí)戰(zhàn)項(xiàng)目之實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器
隨著移動(dòng)互聯(lián)網(wǎng)的普及,手機(jī)應(yīng)用程序已經(jīng)成為人們生活中不可或缺的一部分,計(jì)算器是一類(lèi)被廣泛使用的應(yīng)用程序之一,這篇文章主要給大家介紹了關(guān)于Android實(shí)戰(zhàn)項(xiàng)目之實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器的相關(guān)資料,需要的朋友可以參考下2023-10-10Android文本框搜索和清空效果實(shí)現(xiàn)代碼及簡(jiǎn)要概述
在工作過(guò)程中可能會(huì)遇到這樣一個(gè)效果:文本框輸入為空時(shí)顯示輸入的圖標(biāo);不為空時(shí)顯示清空的圖標(biāo),此時(shí)點(diǎn)擊清空?qǐng)D標(biāo)能清空文本框內(nèi)輸入文字,感興趣的你可以了解下哦,或許對(duì)你學(xué)習(xí)android有所幫助2013-02-02新浪微博第三方登錄界面上下拉伸圖片之第三方開(kāi)源PullToZoomListViewEx(二)
這篇文章主要介紹了新浪微博第三方登錄界面上下拉伸圖片之第三方開(kāi)源PullToZoomListViewEx(二) 的相關(guān)資料,需要的朋友可以參考下2015-12-12Windows實(shí)現(xiàn)Flutter環(huán)境搭建及配置這一篇就夠了
這篇文章主要介紹了Windows實(shí)現(xiàn)Flutter環(huán)境搭建及配置這一篇就夠了,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Android中利用zxing實(shí)現(xiàn)自己的二維碼掃描識(shí)別詳解
這篇文章主要給大家介紹了關(guān)于Android中利用zxing實(shí)現(xiàn)自己的二維碼掃描識(shí)別的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用zxing具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09