最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android布局優(yōu)化之ViewStub控件

 更新時間:2016年05月31日 17:20:37   作者:Windstep  
ViewStub是一個非常輕量級的View,這篇文章主要為大家詳細介紹了Android布局優(yōu)化之ViewStub控件的使用方法以及注意事項,感興趣的小伙伴們可以參考一下

ViewStub是Android布局優(yōu)化中一個很不錯的標簽/控件,直接繼承自View。雖然Android開發(fā)人員基本上都聽說過,但是真正用的可能不多。

ViewStub可以理解成一個非常輕量級的View,與其他的控件一樣,有著自己的屬性及特定的方法。當ViewStub使用在布局文件中時,當程序inflate布局文件時,ViewStub本身也會被解析,且占據(jù)內(nèi)存控件,但是與其他控件相比,主要區(qū)別體現(xiàn)在以下幾點:

1.當布局文件inflate時,ViewStub控件雖然也占據(jù)內(nèi)存,但是相相比于其他控件,ViewStub所占內(nèi)存很小;

2.布局文件inflate時,ViewStub主要是作為一個“占位符”的性質(zhì),放置于view tree中,且ViewStub本身是不可見的。ViewStub中有一個layout屬性,指向ViewStub本身可能被替換掉的布局文件,在一定時機時,通過viewStub.inflate()完成此過程;

3.ViewStub本身是不可見的,對ViewStub setVisibility(..)與其他控件不一樣,ViewStub的setVisibility 成View.VISIBLE或INVISIBLE如果是首次使用,都會自動inflate其指向的布局文件,并替換ViewStub本身,再次使用則是相當于對其指向的布局文件設(shè)置可見性。

這里需要注意的是:

1.ViewStub之所以常稱之為“延遲化加載”,是因為在教多數(shù)情況下,程序無需顯示ViewStub所指向的布局文件,只有在特定的某些較少條件下,此時ViewStub所指向的布局文件才需要被inflate,且此布局文件直接將當前ViewStub替換掉,具體是通過viewStub.infalte()或viewStub.setVisibility(View.VISIBLE)來完成;

2.正確把握住ViewStub的應(yīng)用場景非常重要,正如如1中所描述需求場景下,使用ViewStub可以優(yōu)化布局;

3.對ViewStub的inflate操作只能進行一次,因為inflate的時候是將其指向的布局文件解析inflate并替換掉當前ViewStub本身(由此體現(xiàn)出了ViewStub“占位符”性質(zhì)),一旦替換后,此時原來的布局文件中就沒有ViewStub控件了,因此,如果多次對ViewStub進行infalte,會出現(xiàn)錯誤信息:ViewStub must have a non-null ViewGroup viewParent。

4.3中所講到的ViewStub指向的布局文件解析inflate并替換掉當前ViewStub本身,并不是完全意義上的替換(與include標簽還不太一樣),替換時,布局文件的layout params是以ViewStub為準,其他布局屬性是以布局文件自身為準。

下面看一下簡單的需求場景:在listview顯示列表數(shù)據(jù)時,可能會出現(xiàn)服務(wù)端一條數(shù)據(jù)都沒有的情況,此時顯示一個EmptyView,提示用戶暫無數(shù)據(jù)。此時考慮到實際應(yīng)用中EmptyView顯示出來的機會相當小,因此,可以在布局文件中使用ViewStub站位,然后確實沒有數(shù)據(jù)時才viewStub.infalte()。

相關(guān)部分代碼如下:

public void showEmptyView() {
  listview.setVisibility(View.GONE);
  if (noDataView == null) {
    ViewStub noDataViewStub = (ViewStub) view.findViewById(R.id.no_data_viewstub);
    noDataView = noDataViewStub.inflate();
  } else {
    noDataView.setVisibility(View.VISIBLE);
  }
}

public void showListView(){
  listview.setVisibility(View.VISIBLE);
  if(noDataView != null){
    noDataView.setVisibility(View.GONE);
  }
}

特別需要注意的是對ViewStub是否已經(jīng)inflate的判斷。

在Listview Item中,有時候可能遇到如下場景:在不同的列表頁item的布局一部分不同,但相對于整個item布局來說又不是很多,此時最常見的有如下兩種處理:

1.對不同的部分都寫出來,放到一個item文件中,然后邏輯分別處理不同部分的顯示與否(View.VISIBLE和View.GONE);

2.對這兩種不同的item整個部分都分別區(qū)分開,完全寫成兩個item文件,然后結(jié)合listView顯示不同布局分別做邏輯處理(通過getItemType()等方式)。

以上兩種處理方式其實都可以,第一種方式邏輯清晰,非常靈活,只是在一定程度上增加了內(nèi)存和資源消耗。第二種方式是的布局文件有重復(fù)(雖然相同部分可以通過include,但是邏輯上還是有重復(fù)的),包括邏輯上處理的代碼實質(zhì)上的重復(fù)。一般對于有較大不同的item布局推薦采用此種方式。

有時候結(jié)合需求,可以在第一種方式的基礎(chǔ)上,結(jié)合ViewStub“占位符”可以比較好的完成此類需求。也相當于是兩種方式的一種折中形式,但同時兼顧了內(nèi)存和資源消耗以及不同的布局邏輯控件。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Kotlin Fragment使用方法詳解

    Kotlin Fragment使用方法詳解

    Fragment是Android3.0后引入的一個新的API,他出現(xiàn)的初衷是為了適應(yīng)大屏幕的平板電腦, 當然現(xiàn)在他仍然是平板APP UI設(shè)計的寵兒,而且我們普通手機開發(fā)也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段
    2023-01-01
  • Android 中Popwindow彈出菜單的兩種方法實例

    Android 中Popwindow彈出菜單的兩種方法實例

    這篇文章主要介紹了Android 中Popwindow彈出菜單的兩種方法實例的相關(guān)資料,這里提供了兩種實現(xiàn)的方法,并附有實例代碼,需要的朋友可以參考下
    2017-03-03
  • Android實現(xiàn)IM多人員組合的群組頭像

    Android實現(xiàn)IM多人員組合的群組頭像

    這篇文章主要為大家詳細介紹了Android實現(xiàn)IM多人員組合的群組頭像,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android 歡迎全屏圖片詳解及實例代碼

    Android 歡迎全屏圖片詳解及實例代碼

    這篇文章主要介紹了Android 歡迎全屏圖片詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 詳解Flutter的路由導(dǎo)航

    詳解Flutter的路由導(dǎo)航

    這篇文章主要介紹了Flutter的路由導(dǎo)航的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Flutter,感興趣的朋友可以了解下
    2021-04-04
  • Android防止按鈕過快點擊造成多次事件的解決方法

    Android防止按鈕過快點擊造成多次事件的解決方法

    這篇文章主要介紹了Android防止按鈕過快點擊造成多次事件的解決方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Android拆輪子系列之寫驗證碼控件的方法

    Android拆輪子系列之寫驗證碼控件的方法

    這篇文章主要介紹了Android拆輪子系列之寫驗證碼控件的方法的, 涉及到Canvas和pint的使用和View的基本用法等相關(guān)知識點,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2016-10-10
  • Android PopupWindow增加半透明蒙層

    Android PopupWindow增加半透明蒙層

    這篇文章主要為大家詳細介紹了Android PopupWindow增加半透明蒙層,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • RxJava+Retrofit實現(xiàn)網(wǎng)絡(luò)請求封裝的方法

    RxJava+Retrofit實現(xiàn)網(wǎng)絡(luò)請求封裝的方法

    Retrofit是當前應(yīng)用非常廣泛的網(wǎng)絡(luò)請求框架,通常結(jié)合RxJava來進行網(wǎng)絡(luò)請求,本文將展示一個采用RxJava+Retrofit的網(wǎng)絡(luò)請求demo,感興趣的可以了解一下
    2019-04-04
  • Android 中 Swipe、Scroll 和 Fling 的區(qū)別解析

    Android 中 Swipe、Scroll 和 Fling 的區(qū)別解

    Swipe、Scroll和Fling是Android中常見的觸摸手勢,它們在用戶體驗和技術(shù)實現(xiàn)上各有特點,Swipe用于快速切換,Scroll用于連續(xù)滾動,Fling用于實現(xiàn)慣性滾動,開發(fā)者可以根據(jù)需求選擇合適的手勢類型,并結(jié)合GestureDetector等工具實現(xiàn)各種交互效果,感興趣的朋友跟隨小編一起看看吧
    2024-12-12

最新評論

贵定县| 淮南市| 龙山县| 贵阳市| 林芝县| 宝兴县| 吴堡县| 泽普县| 定西市| 山丹县| 蓝田县| 泽普县| 东至县| 荔浦县| 新昌县| 长武县| 衡山县| 亚东县| 儋州市| 南陵县| 东光县| 内江市| 平顺县| 远安县| 哈尔滨市| 礼泉县| 和平区| 阜南县| 湟中县| 无锡市| 平泉县| 东明县| 贵定县| 余江县| 潢川县| 安康市| 稻城县| 霍山县| 台北市| 土默特右旗| 黄浦区|