8

私のアプリでは、スピナーと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_width="fill_parent"
    android:layout_height="wrap_content"/>
</RelativeLayout>

どこが間違っているのか教えてください。これを解決する他の解決策がある場合は、共有してください。

ありがとう。

4

1 に答える 1

24

ViewStubこのようなシナリオで使用するようには設計されていません。スタブがインフレートされた後、スタブはビュー階層から削除されます。そのため、親がなく、言及されていませんIllegalStateExceptionViewStub複数回使用することはできません。また、 a への長期間の参照を保持するViewStub必要はありません。必要な場合は、null膨張後にそれを実行することをお勧めします。GC はそれを食べることができます。

addView()/removeView()を使用してビューを置き換えることを検討してください。または、ViewFlipperを使用することをお勧めします。

于 2012-07-20T12:21:17.450 に答える