ViewStub 在有条件地膨胀多个布局时引发错误

Posted

技术标签:

【中文标题】ViewStub 在有条件地膨胀多个布局时引发错误【英文标题】:ViewStub raises error while inflating more than one layouts conditionally 【发布时间】:2012-07-19 16:32:18 【问题描述】:

在我的应用程序中,我有一个微调器和一个 ViewStub,根据从微调器中选择的用户项,我必须为不同的布局充气并在微调器下方显示充气的布局。当我的应用程序启动时,ViewStub 在第一次从微调器中选择任何项目时成功地扩展了布局。当我尝试从微调器中选择一个新项目时,它会在下面引发异常

java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent

到目前为止我的代码是

@Override
public void onItemSelected(AdapterView<?> pParent, View pView, int pPosition, long pId) 

if(pPosition == 1)
    m_cStub.setLayoutResource(R.layout.text_form);
else if(pPosition == 2)
    m_cStub.setLayoutResource(R.layout.integer_form);

View inflated = m_cStub.inflate();

m_cStub 是在 Activity 的 onCreate() 内创建的 ViewStub 对象。

这是我的主要布局 xml 代码

<RelativeLayout..................>
     <spinner......................./>

     <ViewStub android:id="@+id/dynamic_form_layout"
    android:inflatedId="@+id/dynamic_form_inflated_id"
    android:layout_alignParentBottom="true"
    android:layout_
    android:layout_/>
</RelativeLayout>

谁能告诉我哪里出错了。如果您有任何其他解决方案可以解决此问题,请分享。

谢谢。

【问题讨论】:

这只是猜测试试这个pView= m_cStub.inflate(); @gtumca-MAC 它不起作用,因为错误是 ViewStub 而不是 View。 【参考方案1】:

ViewStub 并非设计用于此类场景。在存根膨胀后,存根从视图层次结构中移除。这就是为什么它没有父级并提到了IllegalStateExceptionViewStub 不能多次使用。同样保持对ViewStub 的长寿命引用是不必要的,如果需要,最好在充气后null 它,这样GC 可以吃掉它。

考虑使用addView() / removeView() 替换您的视图。或者更好地使用ViewFlipper。

【讨论】:

以上是关于ViewStub 在有条件地膨胀多个布局时引发错误的主要内容,如果未能解决你的问题,请参考以下文章

单个viewStub中的多个布局

如何检查 viewStub 是不是已经膨胀?

创建新视图时动态隐藏视图

Android性能优化:ViewStub

Android性能优化:ViewStub

ViewStub的使用