Tata letak Android menggantikan tampilan dengan tampilan lain saat dijalankan

175

Saya memiliki xmlfile -layout utama dengan dua tampilan teks A / B dan tampilan C. Saya memiliki dua xmlfile -layout lain option1dan option2. Apakah mungkin memuat salah satu option1atau option2dalam waktu berjalan melalui Java ke C? Jika demikian, fungsi apa yang harus saya gunakan?

Kristen
sumber

Jawaban:

372

Anda dapat mengganti tampilan kapan saja.

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

Jika Anda tidak ingin mengganti View yang sudah ada , tetapi pilih antara option1 / option2 pada waktu inisialisasi, maka Anda bisa melakukan ini dengan lebih mudah: atur android:idtata letak induk lalu:

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

Anda harus mengatur "indeks" ke nilai yang tepat tergantung pada struktur tampilan. Anda juga bisa menggunakan ViewStub : tambahkan tampilan C Anda sebagai ViewStub dan kemudian:

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

Dengan begitu Anda tidak perlu khawatir tentang nilai "indeks" di atas jika Anda ingin merestrukturisasi tata letak XML Anda.

broot
sumber
Haruskah saya menghapus fragmen, atau apakah fragmen juga akan dihapus?
K - Keracunan dalam SO tumbuh.
3
@KarlMorrison Pertanyaan ini sudah hampir 4 tahun dan tidak ada hubungannya dengan fragmen. Saya menyarankan untuk mengajukan pertanyaan baru dan / atau melihat android.app.FragmentTransactiondan replace()metode itu.
lupz
Sangat disayangkan jawaban Anda terlalu kompleks - dalam komentar - untuk programmer Android pemula :-(
Antonio Sesto
2
@AntonioSesto apa yang terlalu rumit? Di mana Anda bingung?
AdamMc331
@broot Saya ingin menambahkan Gambar secara sehari-hari ke linearlayout saya yang telah saya lakukan. kemudian saya menghapus beberapa gambar dari layout. maka saya ingin mengembalikannya pada posisinya sendiri dari tempat saya dihapus. berarti saya ingin menambahkan gambar tanpa menghapus orang tua anak, bisakah Anda membantu saya?
PriyankaChauhan
43

Dan jika Anda melakukannya sangat sering, Anda bisa menggunakan ViewSwitcher atau ViewFlipper untuk memudahkan penggantian tampilan.

Snicolas
sumber
Ya, jika ada pertanyaan tentang pandangan alternatif, maka tampilan sirip / switcher lebih baik digunakan
Zoombie
2
@Shail Adi, apakah Anda mencoba untuk mendapatkan kode tutorial ViewSwitcher?
Snicolas
Saya tahu ini sudah tua - tetapi peringatannya adalah bahwa ViewSwitcher menginisialisasi dan menahan kedua Views itu sendiri (sebuah FrameLayout).
Vikram Bodicherla
Ini harus menjadi jawaban yang direkomendasikan. Mengapa tidak menggunakan solusi yang sudah teruji dan siap pakai.
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);
    }
Kaiwalya Rangle
sumber
6
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban
frobinsonj
0

itu berfungsi dalam kasus saya, oldSensor dan newSnsor - oldView dan 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);
        }
ch13mob
sumber