Saya memiliki aktivitas dan banyak widget di dalamnya, beberapa dari mereka memiliki animasi dan karena animasi beberapa widget bergerak (menerjemahkan) satu sama lain. Misalnya tampilan teks bergerak di beberapa tombol. . .
Sekarang masalahnya adalah saya ingin tombol selalu di depan. Dan ketika textview bergerak, saya ingin bergerak di belakang tombol.
Saya tidak dapat mencapai ini, saya mencoba semua yang saya tahu, dan "bringToFront ()" pasti tidak berfungsi.
perhatikan saya tidak ingin mengontrol z-order dengan urutan menempatkan elemen ke tata letak karena saya tidak bisa :), tata letak yang kompleks dan saya tidak dapat menempatkan semua tombol di mengemis tata letak
RelativeLayout
dengan tampilan "atas" muncul terakhir di XML. Lihat stackoverflow.com/a/31340762/1121497Jawaban:
Anda dapat memanggil bringToFront () pada tampilan yang Anda inginkan di depan
Ini adalah sebuah contoh:
sumber
A / B / C
dan ingin membawaA
ke depan, jadi setelah berlaria.bringToFront()
saya berakhir dengan tata letak sepertiB / C / A
.LinearLayout
tidak dapat digunakan denganbringToFront
. Saya akhirnya menggunakanRelativeLayout
. Lihat komentar saya pada pertanyaan itu sendiri.ViewCompat.setTranslationZ(view, 1)
bekerja dengan baik di sisi lain.Saya telah mencari-cari stack overflow untuk menemukan jawaban yang bagus dan ketika saya tidak dapat menemukan jawabannya, saya mencari melalui dokumen.
sepertinya belum ada yang menemukan jawaban sederhana ini:
terjemahan default z adalah 0.0
sumber
setZ()
? Jika saya ingat dengan benar, posisi Z pada tampilan adalah elevasinya ditambah terjemahannya Z, setelah semua.ViewCompat.setZ(view, yourValueInPixels);
view.setZ()
hanya berfungsi pada API 21 dan lebih tinggi.Solusi yang lebih sederhana adalah dengan mengedit XML aktivitas. Menggunakan
sumber
bringToFront()
adalah cara yang benar, tetapi, CATATAN bahwa Anda harus meneleponbringToFront()
daninvalidate()
metode pada tampilan tingkat tertinggi (di bawah tampilan root Anda), misalnya:Hirarki tampilan Anda adalah:
Jadi, ketika Anda menghidupkan kembali tombol Anda (1-> 6), tombol Anda akan berada di bawah (di bawah)
ImageView
. Untuk membawanya (di atas),ImageView
Anda harus memanggilbringToFront()
daninvalidate()
metode pada AndaLinearLayout
. Maka itu akan bekerja :) ** CATATAN: Ingatlah untuk mengaturandroid:clipChildren="false"
tata letak root Anda atau gradparent_layout tampilan-animate. Mari kita lihat kode asli saya:.xml
Beberapa kode dalam .java
Gluck!
sumber
ConstraintLayout
yang berisiRelativeLayout
, dan yang lainnyaRelativeLayout
, keduanya memiliki ukuran yang sama dengan akarnyaConstraintLayout
(match_parent
). Yang pertamaRelativeLayout
memilikiButton
, dan juga di belakang (z-order-wise) yang keduaRelativeLayout
. Bisakah saya membuat yangButton
pertamaRelativeLayout
muncul seolah-olah itu di atas segalanya, sehingga terlihat dan dapat diklik, menggunakanView::bringToFront()
?Dengan kode ini dalam xml
sumber
90dp
datangnya?Coba
FrameLayout
, ini memberi Anda kemungkinan untuk menempatkan pandangan satu di atas yang lain. Anda dapat membuat duaLinearLayouts
: satu dengan tampilan latar belakang, dan satu dengan tampilan latar depan, dan menggabungkannya menggunakanFrameLayout
. Semoga ini membantu.sumber
Jika Anda menggunakan
ConstraintLayout
, cukup letakkan elemen setelah elemen lain untuk membuatnya di depan daripada yang lainsumber
Anda dapat mencoba menggunakan
bringChildToFront
, Anda dapat memeriksa apakah dokumentasi ini bermanfaat di halaman Android Developers .sumber
Mungkin ada cara lain yang menyelamatkan hari itu. Hanya init Dialog baru dengan tata letak yang diinginkan dan hanya menunjukkannya. Saya membutuhkannya untuk menampilkan loadingView melalui DialogFragment dan ini adalah satu-satunya cara saya berhasil.
bringToFront () mungkin tidak berfungsi dalam beberapa kasus seperti milik saya. Tetapi konten tata letak dialog_top harus menimpa apa pun di lapisan ui. Tapi bagaimanapun, ini adalah solusi buruk.
sumber
saya telah menghadapi masalah yang sama. solusi berikut telah bekerja untuk saya.
Solusi kedua adalah dengan menggunakan xml menambahkan atribut ini ke tampilan xml
sumber
Anda dapat menggunakan BindingAdapter seperti ini:
sumber
Anda perlu menggunakan framelayout. Dan cara yang lebih baik untuk melakukan ini adalah membuat tampilan tidak terlihat ketika tidak diperlukan. Anda juga perlu mengatur posisi untuk setiap tampilan, sehingga mereka akan bergerak sesuai dengan posisi yang sesuai di sana
sumber
Jika Anda menggunakan,
LinearLayout
Anda harus meneleponmyView.bringToFront()
dan setelah Anda meneleponparentView.requestLayout()
danparentView.invalidate()
memaksa orang tua untuk menggambar ulang dengan pesanan anak baru.sumber
Coba gunakan elevasi di atasnya, sesuatu seperti
yourview.setElevation(5);
sumber
Berkat pengguna Stack atas penjelasan ini , saya dapat menggunakannya bahkan di Android 4.1.1
Pada penggunaan dinamis saya, misalnya, saya lakukan
Dan Bamm!
sumber
Atur mereka sesuai urutan yang ingin Anda tampilkan. Misalkan, Anda ingin menampilkan tampilan 1 di atas tampilan 2. Kemudian tulis kode tampilan 2 lalu tulis kode tampilan 1. Jika Anda tidak dapat melakukan pemesanan ini, maka panggil bringToFront () ke tampilan akar tata letak yang ingin Anda bawa di depan.
sumber
Anda dapat mengatur visibilitas ke false tampilan lain.
atau
dan mengatur
sumber