ViewStub raises error while inflating more than one layouts conditionally
Asked Answered
C

1

8

In my app, I am having a spinner, and a ViewStub, depending upon the user item selection from spinner, I have to inflate different layouts and show the inflated layout below the spinner. When my app starts, ViewStub successfully inflates a layout on first time selection of any item from spinner. When I tries to select a new item from spinner, it raises Exception below

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

My code so far is

@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 is a ViewStub object created inside onCreate() of the Activity.

Here is my main layout xml code

<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>

Can anybody please tell me where I am going wrong. If you have any other solution to solve this please share.

Thanks.

Cronus answered 20/7, 2012 at 11:42 Comment(2)
This is just guess try this pView= m_cStub.inflate();Melonymelos
@gtumca-MAC it will not work because the error is with ViewStub not with View.Cronus
K
24

ViewStub is not designed to be used in scenarios like this one. After the stub is inflated, the stub is removed from the view hierarchy. That's why it has no parent and mentioned IllegalStateException raised. ViewStub can’t be used more than once. Also keeping long-lived reference to a ViewStub is unnecessary, if it is required, it's good practice to null it after inflating, so GC can eat it.

Consider using addView() / removeView() to replace your views. Or better use ViewFlipper.

Kingsly answered 20/7, 2012 at 12:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.