У меня есть основной файл xml
-layout с двумя текстовыми представлениями A/B и представлением C. У меня есть два других файла xml
-layout option1
и option2
. Можно ли загрузить option1
или option2
во время выполнения через Java в C? Если да, то какую функцию я должен использовать?
Плагин Android заменяет вид другим видом во время выполнения
Ответ 1
Вы можете в любое время заменить любое представление.
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);
Если вы не хотите заменять уже существующий Вид, но выбираете между параметром 1/option2 во время инициализации, тогда вы можете сделать это проще: установите android:id
для родительского макета, а затем:
ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
View C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);
Вам нужно будет установить "индекс" в соответствующее значение в зависимости от структуры представлений. Вы также можете использовать ViewStub: добавьте свое представление C в виде ViewStub, а затем:
ViewStub C = (ViewStub) findViewById(R.id.C);
C.setLayoutResource(optionId);
C.inflate();
Таким образом вам не придется беспокоиться о значении "index" выше, если вы захотите реструктурировать свой XML-макет.
Ответ 2
И если вы делаете это очень часто, вы можете использовать ViewSwitcher или ViewFlipper, чтобы облегчить замещение вида.
Ответ 3
в моем случае это работает, oldSensor и newSnsor - oldView и 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);
}
Ответ 4
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);
}