Układ systemu Android zastępujący widok innym widokiem w czasie wykonywania


175

Mam xmlplik -layout main z dwoma widokami tekstowymi A / B i widokiem C. Mam dwa inne xmlpliki -layout option1i option2. Czy to możliwe, aby załadować albo option1czy option2w czasie wykonywania przez Java w C? Jeśli tak, jakiej funkcji mam użyć?

Odpowiedzi:


372

W każdej chwili możesz zamienić dowolny widok.

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

Jeśli nie chcesz zastępować już istniejącego widoku , ale wybierasz między opcją 1 / opcją 2 w czasie inicjalizacji, możesz to zrobić łatwiej: ustaw android:iddla układu nadrzędnego, a następnie:

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

Będziesz musiał ustawić "indeks" na odpowiednią wartość w zależności od struktury widoków. Możesz także użyć ViewStub : dodaj swój widok C jako ViewStub, a następnie:

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

W ten sposób nie będziesz musiał martwić się o wartość powyżej „indeksu”, jeśli będziesz chciał przebudować swój układ XML.


Czy muszę usunąć fragment, czy też fragment też zostanie usunięty?
— K - Toksyczność SO rośnie.

3
@KarlMorrison To pytanie ma prawie 4 lata i nie ma nic wspólnego z fragmentami. Proponuję zgłosić nowe pytanie i / lub przyjrzeć się android.app.FragmentTransactionjego replace()metodzie.
— lupz

Szkoda, że ​​twoja odpowiedź jest zbyt złożona - w komentarzach - dla początkujących programistów Androida :-(
— Antonio Sesto

2
@AntonioSesto co jest zbyt skomplikowane? Gdzie się pomyliłeś?
— AdamMc331

@broot Chcę codziennie dodawać obrazy do mojego linearnego układu, który zrobiłem. później usuwam niektóre obrazy z układu. następnie chcę przywrócić go na jego miejscu, z którego usunąłem. oznacza, że ​​chcę dodawać obrazy bez usuwania rodzica dziecka, czy możesz mnie zawstydzić?
— PriyankaChauhan

43

Jeśli robisz to bardzo często, możesz użyć ViewSwitcher lub ViewFlipper, aby ułatwić zastępowanie widoku.


Tak, jeśli jest kwestia alternatywnych widoków, to widok flipper / switcher jest lepszy w użyciu
— Zoombie

2
@Shail Adi, czy próbowałeś gooleć kod samouczka ViewSwitcher?
— Snicolas

Wiem, że to jest stare - ale zastrzeżeniem jest to, że ViewSwitcher inicjuje i przechowuje oba widoki w sobie (FrameLayout).
— Vikram Bodicherla

To powinna być zalecana odpowiedź. Dlaczego nie skorzystać po prostu z gotowego, dobrze przetestowanego rozwiązania.

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
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi
— frobinsonj

0

działa w moim przypadku, oldSensor i newSnsor - oldView i 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);
        }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.