Android-макет, заменяющий представление другим представлением во время выполнения - PullRequest
163 голосов
/ 26 июля 2010

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

Ответы [ 4 ]

356 голосов
/ 21 сентября 2010

Вы можете заменить любое представление в любое время.

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

Если вы не хотите заменять уже существующее Представление , но выбираете между option1 / option2 во время инициализации, тогда вы можете сделать это проще: установите android:id для родительского макета и затем:

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

Вы должны будете установить «index» на правильное значение в зависимости от структуры представлений. Вы также можете использовать ViewStub : добавить представление C в качестве ViewStub, а затем:

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

Таким образом, вам не придется беспокоиться о значении «index» выше, если вы захотите реструктурировать макет XML.

41 голосов
/ 05 мая 2011

И если вы делаете это очень часто, вы можете использовать ViewSwitcher или ViewFlipper , чтобы упростить замену представления.

0 голосов
/ 27 июня 2019
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);
    }
0 голосов
/ 06 апреля 2018

это работает в моем случае, 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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...