Bir görünümü çalışma zamanında başka bir görünümle değiştiren Android düzeni


175

xmlİki metin görünümü A / B ve bir görünüm C ile bir -layout dosya ana var . Diğer iki xml-layout dosya option1ve var option2. C ile Java üzerinden option1veya option2çalışma zamanında yüklenebilir mi? Öyleyse, hangi işlevi kullanmam gerekiyor?

Yanıtlar:


372

Herhangi bir görünümü istediğiniz zaman değiştirebilirsiniz.

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

Zaten var olan Görünümü değiştirmek istemezseniz , ancak başlatma zamanında option1 / option2 arasından seçim yaparsanız, bunu daha kolay yapabilirsiniz: android:idüst düzen için ayarlayın ve ardından:

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

Görünüm yapısına bağlı olarak "index" değerini uygun değere ayarlamanız gerekir. Ayrıca bir ViewStub kullanabilirsiniz : C görünümünüzü ViewStub olarak ekleyin ve ardından:

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

Bu şekilde, XML mizanpajınızı yeniden yapılandırmak istiyorsanız yukarıdaki "endeks" değeri konusunda endişelenmenize gerek kalmaz.


Parçayı çıkarmalı mıyım yoksa parça da kaldırılacak mı?
K - SO'da toksisite artıyor.

3
@KarlMorrison Bu soru neredeyse 4 yaşında ve parçalarla ilgisi yok. Ben yeni bir soru dosya ve / veya bakmak önermek android.app.FragmentTransactionve bu kadar replace()yöntemi.
lupz

Acemi Android programcıları için cevabınız çok karmaşık - yorumlarda - yazık :-(
Antonio Sesto

2
@AntonioSesto çok karmaşık olan nedir? Nerede kafan karıştı?
AdamMc331

@broot Görüntüleri doğrusal olarak yaptığım lineerout'uma eklemek istiyorum. daha sonra bazı görüntüleri mizanpajdan kaldırırım. kaldırdığım yerden kendi yerine geri yüklemek istiyorum. Çocuğun ebeveynini çıkarmadan resim eklemek istediğim anlamına gelir, lütfen bana kulak asabilir misin?
PriyankaChauhan

43

Eğer çok sık yaparsanız, bir kullanabilirsiniz ViewSwitcher veya ViewFlipper kolaylığı görünümü ikamesine.


Evet, alternatif görünümler söz konusu olduğunda, görünüm
paletini

2
@Shail Adi, bir ViewSwitcher eğitim kodunu aramaya çalıştınız mı?
Snicolas

Bu eski olduğunu biliyorum - ama uyarı bir ViewSwitcher başlatır ve her iki Görünüm kendi içinde (bir FrameLayout) tutar.
Vikram Bodicherla

Bu tavsiye cevabı olmalıdır. Neden sadece hazır test edilmiş bir çözüm kullanmıyorsunuz?

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
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden
çözüldüğüne

0

benim durumumda çalışır, oldSensor ve newSnsor - oldView ve 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);
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.