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

时间:2012-07-20 11:42:38

标签: android inflate layout-inflater viewstub

在我的应用中,我有一个微调器和一个 ViewStub ,这取决于微调器中的用户项目选择,我必须膨胀不同的布局并在微调器下面显示膨胀的布局。当我的应用程序启动时, ViewStub 会在首次选择来自微调器的任何项目时成功膨胀布局。当我尝试从微调器中选择一个新项时,它会在

下面引发Exception
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是在活动的 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_width="fill_parent"
    android:layout_height="wrap_content"/>
</RelativeLayout>

任何人都可以告诉我哪里出错了。如果您有任何其他解决方案,请分享。

感谢。

1 个答案:

答案 0 :(得分:23)

ViewStub并非设计用于此类场景。存根被夸大后,存根将从视图层次结构中删除。这就是为什么它没有父母并且提到了IllegalStateExceptionViewStub不能多次使用。保持对ViewStub的长期参考是不必要的,如果需要,在充气后null是好的做法,因此GC可以吃它。

考虑使用addView() / removeView()替换您的观看次数。或者更好地使用ViewFlipper