Layout Android che sostituisce una vista con un'altra vista in fase di esecuzione


175

Ho un xmlfile -layout principale con due visualizzazioni di testo A / B e una vista C. Ho altri due xmlfile -outout option1e option2. È possibile caricare uno option1o option2in fase di esecuzione tramite Java in C? In tal caso, quale funzione devo usare?

Risposte:


372

È 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: insieme android:idper il layout genitore e quindi:

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

Dovrai impostare "indice" sul valore corretto in base alla struttura delle viste. È inoltre possibile utilizzare un ViewStub : aggiungere la vista C come ViewStub e quindi:

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

In questo modo non dovrai preoccuparti del valore "index" sopra se desideri ristrutturare il layout XML.


Devo rimuovere il frammento o verrà rimosso anche il frammento?
K - La tossicità in SO sta crescendo.

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 android.app.FragmentTransactioned è il replace()metodo.
Lupz,

È un peccato che la tua risposta sia troppo complessa - nei commenti - per i programmatori Android alle prime armi :-(
Antonio Sesto

2
@AntonioSesto cos'è troppo complesso? Dove sei stato confuso?
AdamMc331,

@broot Voglio aggiungere immagini per giorno al mio linearlayout che ho fatto. successivamente rimuovo alcune immagini dal layout. quindi voglio ripristinarlo nella sua posizione da dove l'ho rimosso. vuol dire che voglio aggiungere immagini senza rimuovere il genitore del bambino, per favore, mi puoi salutare?
Priyanka

43

E se lo fai molto spesso, potresti usare un ViewSwitcher o un ViewFlipper per facilitare la sostituzione della vista.


Sì, se c'è una domanda di visualizzazioni alternative, allora è meglio usare view flipper / switcher
Zoombie

2
@Shail Adi, hai provato a cercare un codice tutorial di ViewSwitcher?
Snicolas,

So che questo è vecchio, ma l'avvertimento è che un ViewSwitcher inizializza e contiene entrambe le viste in sé (un FrameLayout).
Vikram Bodicherla,

Questa dovrebbe essere la risposta consigliata. Perché non usare solo una soluzione ben collaudata pronta all'uso.

3
private void replaceView(View oldV,View newV){
        ViewGroup par = (ViewGroup)oldV.getParent();
        if(par == null){return;}
        int i1 = par.indexOfChild(oldV);
        par.removeViewAt(i1);
        par.addView(newV,i1);
    }

6
Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta
frobinsonj

0

funziona nel mio caso, oldSensor e newSnsor - oldView e newView:

private void replaceSensors(View oldSensor, View newSensor) {
            ViewGroup parent = (ViewGroup) oldSensor.getParent();

            if (parent == null) {
                return;
            }

            int indexOldSensor = parent.indexOfChild(oldSensor);
            int indexNewSensor = parent.indexOfChild(newSensor);
            parent.removeView(oldSensor);
            parent.addView(oldSensor, indexNewSensor);
            parent.removeView(newSensor);
            parent.addView(newSensor, indexOldSensor);
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.