Risposte:
È 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.
android.app.FragmentTransactioned è il replace()metodo.
E se lo fai molto spesso, potresti usare un ViewSwitcher o un ViewFlipper per facilitare la sostituzione della vista.
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);
}
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);
}