2010-07-26 12 views

risposta

319

È possibile sostituire qualsiasi vista in qualsiasi momento.

int optionId = someExpression ? R.layout.option1 : R.layout.option2; 

View C = findViewById(R.id.C); 
ViewGroup parent = (ViewGroup) C.getParent(); 
int index = parent.indexOfChild(C); 
parent.removeView(C); 
C = getLayoutInflater().inflate(optionId, parent, false); 
parent.addView(C, index); 

Se non si desidera sostituire già esistente View, ma scegliere tra opzione1/opzione2 in fase di inizializzazione, allora si potrebbe fare questo più facile: impostare android:id per il layout genitore e poi:

ViewGroup parent = (ViewGroup) findViewById(R.id.parent); 
View C = getLayoutInflater().inflate(optionId, parent, false); 
parent.addView(C, index); 

È necessario impostare "indice" sul valore corretto in base alla struttura delle viste. Si potrebbe anche usare un ViewStub: aggiungi la tua vista C come ViewStub e poi:

ViewStub C = (ViewStub) findViewById(R.id.C); 
C.setLayoutResource(optionId); 
C.inflate(); 

In questo modo non dovrete preoccuparvi di sopra "indice" valore se si vuole ristrutturare il layout XML.

+0

È necessario rimuovere il frammento o rimuovere anche il frammento? –

+3

@KarlMorrison Questa domanda ha quasi 4 anni e non ha nulla a che fare con i frammenti. Suggerisco di presentare una nuova domanda e/o dare un'occhiata a 'android.app.FragmentTransaction' ed è il metodo' replace() '. – lupz

+0

Peccato che la tua risposta sia troppo complessa - nei commenti - per i programmatori Android principianti :-( –

36

E se lo si fa molto spesso, è possibile utilizzare uno ViewSwitcher o uno ViewFlipper per facilitare la sostituzione delle viste.

+0

Sì, se c'è una domanda di viste alternative, quindi visualizzare flipper/switcher è meglio usare – Zoombie

+7

@snicolas ... puoi spiegarlo con qualche codice per favore. –

+2

@Shail Adi, hai provato a leggere un codice tutorial di ViewSwitcher? – Snicolas

Problemi correlati