Макет Android, що замінює подання на інший погляд на час виконання


175

Я маю xml головний файл -програми з двома текстовими переглядами A / B та переглядом C. У мене є ще два xmlфайли -програми option1та option2. Чи можна завантажувати або option1або option2під час виконання з допомогою Java в C? Якщо так, то яку функцію я повинен використовувати?

Відповіді:


372

Ви можете будь-коли замінити будь-який вид.

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

Таким чином, вам не доведеться турбуватися про вище "індекс" значення, якщо ви хочете реструктурувати ваш XML макет.


Повинен я вилучити фрагмент, чи фрагмент також буде видалений?
K - Токсичність в SO зростає.

3
@KarlMorrison Це питання майже 4 роки і не має нічого спільного з фрагментами. Я пропоную подати нове запитання та / або ознайомитись із android.app.FragmentTransactionйого replace()методом.
lupz

Шкода, що ваша відповідь занадто складна - у коментарях - для початківців програмістів Android :-(
Антоніо Сесто,

2
@AntonioSesto, що занадто складно? Де ти розгубився?
AdamMc331

@broot Я хочу додати зображення щоденно до моєї лінійної розкладки, що я зробив. пізніше я видаляю деякі зображення з верстки. то я хочу відновити його у власному положенні, звідки я видалився. значить, я хочу додати зображення, не знімаючи батьків дитини. Ви можете, будь ласка, hlep мене
PriyankaChauhan

43

І якщо ви робите це дуже часто, ви можете використовувати ViewSwitcher або ViewFlipper, щоб полегшити заміну перегляду.


Так, якщо є питання про альтернативні погляди, тоді краще використовувати фліппер / комутатор
Zoombie

2
@Shail Adi, ти намагався гул коду підручника ViewSwitcher?
Snicolas

Я знаю, що це старе - але застереження полягає в тому, що ViewSwitcher ініціалізує і тримає обидва погляди в собі (FrameLayout).
Вікрам Бодіхерла

Це має бути рекомендаційною відповіддю. Чому б просто не використовувати готовий добре перевірений розчин.

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

6
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як і / або чому він вирішує проблему, покращиться довгострокове значення відповіді
frobinsonj

0

він працює в моєму випадку, 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);
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.