Respuestas:
Puede reemplazar cualquier vista en cualquier 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);
Si no desea reemplazar la Vista ya existente , pero elige entre la opción1 / opción2 en el momento de la inicialización, entonces podría hacerlo más fácilmente: configure el android:id
diseño primario y luego:
ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
View C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);
Deberá establecer el "índice" en el valor adecuado según la estructura de las vistas. También puede usar un ViewStub : agregue su vista C como ViewStub y luego:
ViewStub C = (ViewStub) findViewById(R.id.C);
C.setLayoutResource(optionId);
C.inflate();
De esa manera, no tendrá que preocuparse por el valor de "índice" anterior si desea reestructurar su diseño XML.
android.app.FragmentTransaction
y su replace()
método.
Y si lo hace con mucha frecuencia, podría usar un ViewSwitcher o un ViewFlipper para facilitar la sustitución de la 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);
}
funciona en mi caso, oldSensor y newSnsor - oldView y 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);
}