Плагин Android заменяет вид другим видом во время выполнения

У меня есть основной файл xml -layout с двумя текстовыми представлениями A/B и представлением C. У меня есть два других файла xml -layout option1 и option2. Можно ли загрузить option1 или option2 во время выполнения через Java в C? Если да, то какую функцию я должен использовать?

Ответ 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);
    }