在问这个问题之前,我确实看到了很多其他帖子。似乎没有一个明确的解决方案。
我遇到了ViewStub的问题,我想检查ViewStub是否膨胀(可见或不可见)。基于此,我还有许多其他事情要做。
我在每个ViewStub布局中使用两个ViewStubs和一个按钮,即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不为null,而我期望它为null。
我有什么遗失的吗?
答案 0 :(得分:6)
我想提出一种不依赖于听众的替代解决方案。
View stub = findViewById(R.id.my_view_stub);
if(stub instanceof ViewStub) {
// it have not been inflated
} else {
// if have been inflated
}
背后的逻辑是,在通货膨胀之后,ViewStub
将从视图层次结构中删除,并被膨胀的布局上的内容替换。
这意味着stub
将是instanceOf FrameLayout/LinearLayout/Button
或其他任何视图在展开的布局上,实际的ViewStub
实例已经消失,如果你没有持有对它,它甚至可能被垃圾收集。
答案 1 :(得分:1)
所以我最终做的是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
}
});
如果布尔值为true,则stub1是启动的屏幕。否则不是。
感谢@pskink的帮助。
答案 2 :(得分:1)
更优雅的解决方案:
if (mViewStub.getParent() != null) {
//have not been inflated
mViewStub.inflate();
} else {
//already inflated
}