本文內(nèi)容轉(zhuǎn)載于 http://blog.csdn.net/hitlion2008/article/details/6737537/ 感謝原作者僵缺!
在開(kāi)發(fā)應(yīng)用程序的時(shí)候窒所,經(jīng)常會(huì)遇到這樣的情況结蟋,會(huì)在運(yùn)行時(shí)動(dòng)態(tài)根據(jù)條件來(lái)決定顯示哪個(gè)View或某個(gè)布局。那么最通常的想法就是把可能用到的View都寫(xiě)在上面宋距,先把它們的可見(jiàn)性都設(shè)為View.GONE劝枣,然后在代碼中動(dòng)態(tài)的更改它的可見(jiàn)性。這樣的做法的優(yōu)點(diǎn)是邏輯簡(jiǎn)單而且控制起來(lái)比較靈活泥从。但是它的缺點(diǎn)就是句占,耗費(fèi)資源。雖然把View的初始可見(jiàn)View.GONE但是在Inflate布局的時(shí)候View仍然會(huì)被Inflate躯嫉,也就是說(shuō)仍然會(huì)創(chuàng)建對(duì)象纱烘,會(huì)被實(shí)例化,會(huì)被設(shè)置屬性祈餐。也就是說(shuō)擂啥,會(huì)耗費(fèi)內(nèi)存等資源。
推薦的做法是使用android.view.ViewStub帆阳,ViewStub是一個(gè)輕量級(jí)的View哺壶,它一個(gè)看不見(jiàn)的,不占布局位置蜒谤,占用資源非常小的控件山宾。可以為ViewStub指定一個(gè)布局鳍徽,在Inflate布局的時(shí)候资锰,只有ViewStub會(huì)被初始化,然后當(dāng)ViewStub被設(shè)置為可見(jiàn)的時(shí)候旬盯,或是調(diào)用了ViewStub.inflate()的時(shí)候台妆,ViewStub所向的布局就會(huì)被Inflate和實(shí)例化,然后ViewStub的布局屬性都會(huì)傳給它所指向的布局胖翰。這樣接剩,就可以使用ViewStub來(lái)方便的在運(yùn)行時(shí),要還是不要顯示某個(gè)布局萨咳。
但ViewStub也不是萬(wàn)能的懊缺,下面總結(jié)下ViewStub能做的事兒和什么時(shí)候該用ViewStub,什么時(shí)候該用可見(jiàn)性的控制。
首先來(lái)說(shuō)說(shuō)ViewStub的一些特點(diǎn):
- ViewStub只能Inflate一次鹃两,之后ViewStub對(duì)象會(huì)被置為空遗座。按句話(huà)說(shuō),某個(gè)被ViewStub指定的布局被Inflate后俊扳,就不會(huì)夠再通過(guò)ViewStub來(lái)控制它了途蒋。
- ViewStub只能用來(lái)Inflate一個(gè)布局文件,而不是某個(gè)具體的View馋记,當(dāng)然也可以把View寫(xiě)在某個(gè)布局文件中号坡。
基于以上的特點(diǎn),那么可以考慮使用ViewStub的情況有:
-
在程序的運(yùn)行期間梯醒,某個(gè)布局在Inflate后宽堆,就不會(huì)有變化,除非重新啟動(dòng)茸习。
- 因?yàn)閂iewStub只能Inflate一次畜隶,之后會(huì)被置空,【一定注意這里号胚,ViewStub在inflate()之后的getVisibility()是GONE】所以無(wú)法指望后面接著使用ViewStub來(lái)控制布局籽慢。所以當(dāng)需要在運(yùn)行時(shí)不止一次的顯示和隱藏某個(gè)布局,那么ViewStub是做不到的猫胁。這時(shí)就只能使用View的可見(jiàn)性來(lái)控制了嗡综。【強(qiáng)行用也可以杜漠,但是就失去了VieStub的意義了】
想要控制顯示與隱藏的是一個(gè)布局文件,而非某個(gè)View察净。
- 因?yàn)樵O(shè)置給ViewStub的只能是某個(gè)布局文件的Id驾茴,所以無(wú)法讓它來(lái)控制某個(gè)View。
所以氢卡,如果想要控制某個(gè)View(如Button或TextView)的顯示與隱藏锈至,或者想要在運(yùn)行時(shí)不斷的顯示與隱藏某個(gè)布局或View,只能使用View的可見(jiàn)性來(lái)控制译秦。
代碼例子可以參考原博的例子峡捡,我就不多貼了。
另外筑悴,還可以是在布局的時(shí)候使用<merge />標(biāo)簽去優(yōu)化布局们拙,感興趣的可以去搜索一下~
希望可以幫到你