2012-07-20 21 views
7

Nella mia app, sto avendo uno spinner e un ViewStub, a seconda della selezione di elementi utente da spinner, devo gonfiare layout diversi e mostrare il layout gonfiato sotto lo spinner. Quando viene avviata la mia app, ViewStub gonfia correttamente un layout alla selezione iniziale di qualsiasi oggetto della selezione. Quando ho tenta di selezionare un nuovo elemento da filatore, solleva eccezione di sottoViewStub genera errori durante il gonfiaggio condizionato di più di un layout

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

Il mio codice finora è

@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 è un oggetto ViewStub creato all'interno onCreate() del Attività.

Qui è la mia principale codice del layout 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> 

Qualcuno può dirmi dove sto andando male. Se hai qualche altra soluzione per risolvere questo per favore condividi.

Grazie.

+0

Questo è solo un tentativo prova questo 'pView = m_cStub.inflate();' – MAC

+0

@ gtumca-MAC non funzionerà perché l'errore è con ViewStub non con View. –

risposta

22

ViewStub non è progettato per essere utilizzato in scenari come questo. Dopo lo stub viene gonfiato, lo stub è rimosso dalla gerarchia della vista. Ecco perché non ha un genitore e ha menzionato lo IllegalStateException sollevato. ViewStub non può essere utilizzato più di una volta. Inoltre, non è necessario mantenere un riferimento longevo a uno ViewStub, se è necessario, è buona norma eseguire lo null dopo il gonfiaggio, in modo che GC possa mangiarlo.

Considerare l'utilizzo di addView()/removeView() per sostituire le visualizzazioni. O meglio usare ViewFlipper.