ViewStub вызывает ошибку при условном раздувании более одного макета

В моем приложении у меня есть счетчик и 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 — это объект ViewStub, созданный внутри onCreate() действия.

Вот мой основной 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>

Может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь. Если у вас есть другое решение, чтобы решить эту проблему, пожалуйста, поделитесь.

Спасибо.


person Chandra Sekhar    schedule 20.07.2012    source источник
comment
Это просто предположение, попробуйте это pView= m_cStub.inflate();   -  person MAC    schedule 20.07.2012
comment
@gtumca-MAC не будет работать, потому что ошибка связана с ViewStub, а не с View.   -  person Chandra Sekhar    schedule 20.07.2012


Ответы (1)


ViewStub не предназначен для использования в подобных сценариях. После расширения заглушка удаляется из иерархии представлений. Вот почему у него нет родителя и упоминается IllegalStateException. ViewStub нельзя использовать более одного раза. Также нет необходимости хранить долгоживущие ссылки на ViewStub, если это необходимо, хорошей практикой является null после надувания, чтобы сборщик мусора мог их съесть.

Рассмотрите возможность использования addView() / removeView() для замены ваших представлений. Или лучше использовать ViewFlipper.

person biegleux    schedule 20.07.2012