Saya ingin menentukan urutan z tampilan RelativeLayout di Android.
Saya tahu satu cara untuk melakukan ini adalah menelepon bringToFront
.
Apakah ada cara yang lebih baik untuk melakukan ini? Akan lebih bagus jika saya bisa mendefinisikan urutan z dalam tata letak xml.
Jawaban:
Cara termudah adalah dengan memperhatikan urutan di mana Tampilan ditambahkan ke file XML Anda. Turun ke bawah dalam file berarti lebih tinggi di sumbu Z.
Sunting: Ini didokumentasikan di sini dan di sini di situs pengembang Android. (Terima kasih @flightplanner)
sumber
Jika Anda ingin melakukan ini dalam kode Anda dapat melakukannya
lihat dokumen
sumber
Harap perhatikan, tombol dan elemen lain di API 21 dan yang lebih tinggi memiliki elevasi tinggi, dan karenanya mengabaikan urutan elemen xml terlepas dari tata letak induk. Butuh waktu beberapa saat untuk memikirkannya.
sumber
Di Android mulai dari API level 21, item dalam file tata letak mendapatkan urutan Z baik dari cara mereka memesan dalam file, seperti yang dijelaskan dalam jawaban yang benar, dan dari ketinggiannya, nilai elevasi yang lebih tinggi berarti item mendapat urutan Z yang lebih tinggi .
Ini kadang-kadang dapat menyebabkan masalah, terutama dengan tombol yang sering muncul di atas item yang menurut urutan XML harus di bawah mereka dalam urutan Z. Untuk memperbaikinya, cukup atur
android:elevation
item di tata letak XML agar sesuai dengan urutan Z yang ingin Anda capai.Jika Anda mengatur ketinggian elemen dalam tata letak itu akan mulai menimbulkan bayangan. Jika Anda tidak ingin efek ini, Anda dapat menghapus bayangan dengan kode seperti ini:
Saya belum menemukan cara untuk menghapus bayangan tampilan yang ditinggikan melalui tata letak xml.
sumber
android:elevation="1000dp"
. Tidak ada bayangan yang ditampilkan dengan cara ini.Saya mengalami masalah yang sama: Di parentView tata letak relatif, saya punya 2 anak childView1 dan childView2. Pada awalnya, saya meletakkan childView1 di atas childView2 dan saya ingin childView1 berada di atas childView2. Mengubah urutan pandangan anak-anak tidak memecahkan masalah bagi saya. Apa yang berhasil bagi saya adalah mengatur android: clipChildren = "false" pada parentView dan dalam kode yang saya set:
sumber
child.bringToFront()
denganparent.invalidate()
karya, tetapiparent.bringChildToFront(child)
tidak. Di mana logika yang kita semua harapkan dari OS?android:clipChildren="false"
berhasil. Terima kasih!Harap perhatikan bahwa Anda dapat menggunakan
view.setZ(float)
mulai dari API level 21. Di sini Anda dapat menemukan lebih banyak info.sumber
Saya pikir saya akan menambahkan jawaban sejak diperkenalkannya
Bidang XML mengubah sedikit hal. Jawaban lain yang menyarankan berjalan
benar-benar tepat KECUALI untuk itu kode ini TIDAK akan membawa childView1 di depan tampilan apa pun dengan android hardcoded: translationZ dalam file XML. Saya mengalami masalah dengan ini, dan begitu saya menghapus bidang ini dari pandangan lain, bringToFront () bekerja dengan baik.
sumber
elevation
API 21 memiliki fitur
view.setElevation(float)
bawaanGunakan
ViewCompat.setElevation(view, float);
untuk kompatibilitas mundurLebih banyak metode
ViewCompat.setZ(v, pixels)
danViewCompat.setTranslationZ(v, pixels)
Cara lain mengumpulkan tombol atau melihat array dan gunakan
addView
untuk menambah RelativeLayoutsumber
childView.bringToFront () tidak berfungsi untuk saya, jadi saya mengatur terjemahan Z dari item yang paling baru ditambahkan (yang overlay semua anak lain) ke nilai negatif seperti:
lastView.setTranslationZ(-10);
lihat https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) untuk informasi lebih lanjut
sumber
Anda dapat menggunakan kustom
RelativeLayout
dengan didefinisikan ulangprotected int getChildDrawingOrder (int childCount, int i)
Sadarilah - metode ini menggunakan param
i
sebagai "tampilan yang harus saya gambari'th
". Beginilah caraViewPager
kerjanya. Ini mengatur urutan gambar kustom dalam hubungannya denganPageTransformer
.sumber
Periksa apakah Anda memiliki ketinggian pada salah satu Tampilan di XML. Jika demikian, tambahkan elevasi ke item lain atau hapus elevasi untuk menyelesaikan masalah. Dari sana, urutan pandanganlah yang menentukan apa yang muncul di atas yang lain.
sumber
Atau letakkan tombol yang tumpang tindih atau tampilan di dalam FrameLayout. Kemudian, RelativeLayout dalam file xml akan menghormati urutan tata letak anak saat ditambahkan.
sumber
Anda dapat menggunakan contoh kode di bawah ini juga untuk mencapai hal yang sama
Ini kompatibel ke belakang. Berikut
mCardView
ini adalah tampilan yang harus di bawah inisourceView
.sumber