检查我的 ViewStub 是否为 inflated/visible 并且 null/non 是否为空?
Check if my ViewStub is inflated/visible and is null/non null?
在问这个问题之前,我确实看到了很多其他帖子。 None好像有定论
我 运行 遇到了 ViewStub 的问题,我想检查 ViewStub 是否膨胀(可见或不可见)。基于此,我还有很多其他事情要做。
我在每个 ViewStub 布局中使用两个 ViewStub 和一个按钮,即 layout/abc 和 layout/def 将膨胀另一个 ViewStub。
<ViewStub
android:id="@+id/abc_stub"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout="@layout/abc" />
<ViewStub
android:id="@+id/def_stub"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout="@layout/def" />
我 运行 遇到的问题是未膨胀的 ViewStub 不为空,而我希望它为空。
有什么我遗漏的吗?
所以我最后做的是 setOnInflateListener (ViewStub.OnInflateListener inflateListener)
ViewStub stub1 = ((ViewStub)findViewById(KR.get(R.abc_stub)));
stub1.setOnInflateListener(new ViewStub.OnInflateListener{
@Override
public void onInflate(ViewStub paramViewStub, View paramView) {
// Set a class boolean if it was inflated
}
});
如果布尔值为真,则 stub1 是启动的屏幕。否则不是。
感谢@pskink 的帮助。
我想提出一个不依赖侦听器的替代解决方案。
View stub = findViewById(R.id.my_view_stub);
if(stub instanceof ViewStub) {
// it have not been inflated
} else {
// if have been inflated
}
其背后的逻辑是,在 inflation 之后,ViewStub
从视图层次结构中删除并替换为膨胀布局上的内容。
这意味着 stub
将是一个 instanceOf FrameLayout/LinearLayout/Button
或膨胀布局上的任何其他视图,并且实际的 ViewStub
实例已经消失,如果您没有引用它,它甚至可能已经被垃圾收集了。
更优雅的解决方案:
if (mViewStub.getParent() != null) {
//have not been inflated
mViewStub.inflate();
} else {
//already inflated
}
以防有人对此感到困惑...
1。 ViewStub.inflate()
实际是做什么的?
// checkout android.view.ViewStub#inflate
// ...
// Actual inflate the xml
final View view = inflateViewNoAdd(parent);
// removte the same id view in parent, then re-add in view just inflated.
replaceSelfWithView(view, parent);
// ...
2。我们如何检查它是否充气?
像Budius的回答,下面是kotlin版本:
inline fun <reified T : View> View?.findViewStubById(id: Int): T? {
if (this == null) {
return null
}
val find = this.findViewById<View>(id)
if (find is ViewStub) {
return find.inflate() as T
}
return find as T
}
在问这个问题之前,我确实看到了很多其他帖子。 None好像有定论
我 运行 遇到了 ViewStub 的问题,我想检查 ViewStub 是否膨胀(可见或不可见)。基于此,我还有很多其他事情要做。
我在每个 ViewStub 布局中使用两个 ViewStub 和一个按钮,即 layout/abc 和 layout/def 将膨胀另一个 ViewStub。
<ViewStub
android:id="@+id/abc_stub"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout="@layout/abc" />
<ViewStub
android:id="@+id/def_stub"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout="@layout/def" />
我 运行 遇到的问题是未膨胀的 ViewStub 不为空,而我希望它为空。
有什么我遗漏的吗?
所以我最后做的是 setOnInflateListener (ViewStub.OnInflateListener inflateListener)
ViewStub stub1 = ((ViewStub)findViewById(KR.get(R.abc_stub)));
stub1.setOnInflateListener(new ViewStub.OnInflateListener{
@Override
public void onInflate(ViewStub paramViewStub, View paramView) {
// Set a class boolean if it was inflated
}
});
如果布尔值为真,则 stub1 是启动的屏幕。否则不是。
感谢@pskink 的帮助。
我想提出一个不依赖侦听器的替代解决方案。
View stub = findViewById(R.id.my_view_stub);
if(stub instanceof ViewStub) {
// it have not been inflated
} else {
// if have been inflated
}
其背后的逻辑是,在 inflation 之后,ViewStub
从视图层次结构中删除并替换为膨胀布局上的内容。
这意味着 stub
将是一个 instanceOf FrameLayout/LinearLayout/Button
或膨胀布局上的任何其他视图,并且实际的 ViewStub
实例已经消失,如果您没有引用它,它甚至可能已经被垃圾收集了。
更优雅的解决方案:
if (mViewStub.getParent() != null) {
//have not been inflated
mViewStub.inflate();
} else {
//already inflated
}
以防有人对此感到困惑...
1。 ViewStub.inflate()
实际是做什么的?
// checkout android.view.ViewStub#inflate
// ...
// Actual inflate the xml
final View view = inflateViewNoAdd(parent);
// removte the same id view in parent, then re-add in view just inflated.
replaceSelfWithView(view, parent);
// ...
2。我们如何检查它是否充气?
像Budius的回答,下面是kotlin版本:
inline fun <reified T : View> View?.findViewStubById(id: Int): T? {
if (this == null) {
return null
}
val find = this.findViewById<View>(id)
if (find is ViewStub) {
return find.inflate() as T
}
return find as T
}