日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android stub,Android:ViewStub

發(fā)布時(shí)間:2023/12/20 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android stub,Android:ViewStub 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ViewStub是一個(gè)輕量級(jí)View,它是一個(gè)看不見(jiàn)的,并且不占布局位置,占用資源非常小的視圖對(duì)象。可以為ViewStub指定一個(gè)布局,加載布局時(shí),只有ViewStub會(huì)被初始化,然后當(dāng)ViewStub被設(shè)置為可見(jiàn)時(shí),或者是調(diào)用了ViewStub.inflate()時(shí),ViewStub所指向的布局會(huì)被加載和實(shí)例化,然后ViewStub的布局屬性都會(huì)傳給它指向的布局。這樣就可以使用ViewStub來(lái)設(shè)置是否顯示某個(gè)布局。

android:inflatedId="@+id/inflatedId"

android:id="@+id/viewStub"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout="@layout/layout_inflate_view_stub"/>

ViewStub是繼承自View,設(shè)置它的可見(jiàn)性,可以通過(guò)ViewStub#setVisibility()和ViewStub#inflate()。

先看ViewStub#setVisibility()方法。

private WeakReference mInflatedViewRef;

public void setVisibility(int visibility) {

if (mInflatedViewRef != null) {

View view = mInflatedViewRef.get();

if (view != null) {

view.setVisibility(visibility);

} else {

throw new IllegalStateException("setVisibility called on un-referenced view");

}

} else {

super.setVisibility(visibility);

if (visibility == VISIBLE || visibility == INVISIBLE) {

inflate();

}

}

}

初次調(diào)用該方法,mInflatedViewRef=null。因此會(huì)先走else邏輯。先通過(guò)super.setVisibility()調(diào)用View的setVisibility方法,更改相關(guān)的標(biāo)志。然后無(wú)論設(shè)置的是View.VISIBLE或者是View.INVISIBLE都會(huì)去調(diào)用ViewStub#inflate()方法。如果mInflatedViewRef!=null,就是正常的設(shè)置可見(jiàn)性。

再看View#inflate()方法。在xml布局中ViewStub節(jié)點(diǎn)下android:layout引入的布局會(huì)將ViewStub替換掉,并且ViewStub的寬高等屬性會(huì)被該布局使用。

public View inflate() {

final ViewParent viewParent = getParent();

if (viewParent != null && viewParent instanceof ViewGroup) {

if (mLayoutResource != 0) {

final ViewGroup parent = (ViewGroup) viewParent;

/*

inflateViewNoAdd()方法被填充的布局生成View對(duì)象。如果為ViewStub設(shè)置了屬性inflatedId,那么這里的view的id會(huì)被替換成該inflatedId。

*/

final View view = inflateViewNoAdd(parent);

//將ViewStub替換成被填充的布局,并使用了ViewStub的屬性。

replaceSelfWithView(view, parent);

mInflatedViewRef = new WeakReference<>(view);

if (mInflateListener != null) {

//監(jiān)聽(tīng)事件需要在inflate()或者setVisibility()之前調(diào)用。

mInflateListener.onInflate(this, view);

}

return view;

} else {

throw new IllegalArgumentException("ViewStub must have a valid layoutResource");

}

} else {

throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");

}

}

最后說(shuō)一下id相關(guān)。

android:inflatedId="@+id/inflatedId"

android:id="@+id/viewStub"

... />

這里定義了id和inflatedId。id是通過(guò)findViewById來(lái)獲取ViewStub的。inflatedId則是獲取被填充的布局,前提是調(diào)用了ViewStub#setVisibility()或者ViewStub#inflate()方法。inflatedId是在方法inflateViewNoAdd()中設(shè)置給被填充的布局的。

使用ViewStub需要注意的地方。

ViewStub只能加載一次。這個(gè)可以從方法replaceSelfWithView看出來(lái)。因此ViewStub不適合需要按需隱藏的情況。

private void replaceSelfWithView(View view, ViewGroup parent) {

final int index = parent.indexOfChild(this);

//移除ViewStub

parent.removeViewInLayout(this);

final ViewGroup.LayoutParams layoutParams = getLayoutParams();

//添加被填充的布局

if (layoutParams != null) {

parent.addView(view, index, layoutParams);

} else {

parent.addView(view, index);

}

}

ViewStub不能嵌套merge標(biāo)簽

一般使用場(chǎng)景。

程序運(yùn)行期間,某個(gè)布局在加載后,就不會(huì)有變化,除非銷毀該頁(yè)面再重新加載。

想要控制顯示與隱藏的是一個(gè)布局文件,而非某個(gè)view。

總結(jié)

以上是生活随笔為你收集整理的android stub,Android:ViewStub的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。