1

在问这个问题之前,我确实看到了很多其他帖子。似乎没有一个明确的解决方案。

我遇到了 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 不为空,而我希望它为空。

有什么我想念的吗?

4

3 回答 3

8

我想提出一个不依赖听众的替代解决方案。

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实例消失了,如果您没有持有对它的引用,它甚至可能已被垃圾收集。

于 2016-06-20T12:39:25.207 回答
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                             
     }
});

如果布尔值为真,则 stub1 是启动的屏幕。否则不是。

感谢@pskink 的帮助。

于 2015-01-22T20:56:53.210 回答
1

更优雅的解决方案:

if (mViewStub.getParent() != null) { 
    //have not been inflated
    mViewStub.inflate();
} else { 
    //already inflated
} 
于 2017-03-08T13:02:28.637 回答