182 votes

Mise en page Android remplaçant une vue par une autre vue au moment de l'exécution

J'ai un xml -J'ai un fichier principal de mise en page avec deux vues de texte A/B et une vue C. J'ai deux autres xml -les fichiers de présentation option1 y option2 . Est-il possible de charger soit option1 o option2 en temps réel via Java en C ? Si oui, quelle fonction dois-je utiliser ?

380voto

broot Points 2295

Vous pouvez remplacer n'importe quelle vue à tout moment.

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);

Si vous ne souhaitez pas remplacer des éléments déjà existants Voir mais choisir entre l'option 1 et l'option 2 au moment de l'initialisation, alors vous pourriez faire ceci plus facilement : définir android:id pour la disposition des parents et ensuite :

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

Vous devrez définir "index" à la valeur appropriée en fonction de la structure des vues. Vous pouvez également utiliser un ViewStub : ajoutez votre vue C comme ViewStub et ensuite :

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

Ainsi, vous n'aurez pas à vous soucier de la valeur "index" ci-dessus si vous souhaitez restructurer votre présentation XML.

0 votes

Dois-je retirer le fragment, ou le fragment sera-t-il également retiré ?

3 votes

@KarlMorrison Cette question date de presque 4 ans et n'a rien à voir avec les fragments. Je vous suggère de déposer une nouvelle question et/ou de jeter un coup d'oeil à android.app.FragmentTransaction et c'est replace() méthode.

0 votes

Dommage que votre réponse soit trop complexe - dans les commentaires - pour les programmeurs novices d'Android :-(

43voto

Snicolas Points 19644

Et si vous faites ça très souvent, vous pourriez utiliser un ViewSwitcher ou un ViewFlipper pour faciliter la substitution de vues.

0 votes

Oui, s'il est question de vues alternées, il est préférable d'utiliser le changeur de vues.

2 votes

@Shail Adi, avez-vous essayé de trouver un code de tutoriel pour ViewSwitcher ?

0 votes

Je sais que c'est vieux, mais le problème est qu'un ViewSwitcher initialise et contient les deux vues en lui-même (un FrameLayout).

3voto

Kaiwalya Rangle Points 33
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);
    }

0voto

ch13mob Points 191

Cela fonctionne dans mon cas, oldSensor et newSnsor - oldView et 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);
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X