Demo margin negatif:
Skenario
Tampilan tumpang tindih dengan menyetel margin negatif ke salah satunya sehingga menyerbu kotak pembatas tampilan lain.
Pikiran
Tampaknya berfungsi seperti yang Anda harapkan dengan tumpang tindih tata letak jika seharusnya. Tetapi saya tidak ingin mengalami masalah yang lebih besar karena tanpa sadar tidak melakukan sesuatu dengan benar. Emulator, perangkat fisik, sebut saja, ketika Anda menggunakan margin negatif semuanya tampak bekerja dengan benar, satu tampilan menyerang kotak pembatas tampilan lain dan bergantung pada bagaimana itu dinyatakan dalam tata letak itu akan berada di atas atau di bawah tampilan lain.
Saya juga menyadari bahwa karena API 21 kita dapat mengatur atribut translationZ
dan elevation
untuk membuat tampilan muncul di atas atau di bawah tampilan lain tetapi perhatian saya pada dasarnya berasal dari fakta bahwa dalam dokumentasi untuk layout_margin
atribut itu dengan jelas ditentukan bahwa nilai margin harus positif , biarkan saya mengutip:
Kutipan:
Menentukan ruang ekstra di sisi kiri, atas, kanan dan bawah tampilan ini. Ruang ini berada di luar batas tampilan ini. Nilai margin harus positif . Harus berupa nilai dimensi, yang merupakan bilangan titik mengambang yang ditambahkan dengan unit seperti "14.5sp". Satuan yang tersedia adalah: px (piksel), dp (piksel tanpa kerapatan), sp (piksel yang diskalakan berdasarkan ukuran font yang disukai), dalam (inci), mm (milimeter) ...
Pada tahun-tahun sejak awalnya mengajukan pertanyaan ini, saya tidak memiliki masalah dengan margin negatif, mencoba menghindari penggunaannya sebanyak mungkin, tetapi tidak mengalami masalah apa pun, jadi meskipun dokumentasi menyatakan bahwa, saya tidak juga. khawatir tentang itu.
sumber
Jawaban:
Pada tahun 2010, @RomainGuy (insinyur Android inti) menyatakan bahwa margin negatif memiliki perilaku yang tidak ditentukan .
Pada tahun 2011, @RomainGuy menyatakan bahwa Anda dapat menggunakan margin negatif pada
LinearLayout
danRelativeLayout
.Pada tahun 2016, @RomainGuy menyatakan bahwa mereka tidak pernah didukung secara resmi dan tidak akan didukung oleh
ConstraintLayout
.Sangat mudah untuk mengatasi batasan ini.
Tambahkan tampilan pembantu (tinggi 0dp, lebar dibatasi ke induk) di bagian bawah tampilan dasar Anda, di bagian bawah tambahkan margin yang Anda inginkan.
Kemudian posisikan tampilan Anda di bawah yang satu ini, secara efektif memungkinkannya memiliki margin "negatif" tetapi tanpa harus menggunakan nilai negatif yang tidak didukung.
sumber
android:clipChildren="false"
dan diandroid:clipToPadding="false"
mana sebelumnya tidak, atau hal - hal rusak seperti ini .Semoga ini bisa membantu seseorang. Berikut adalah kode contoh yang berfungsi menggunakan
ConstraintLayout
berdasarkan jawaban @ CommonsWare:Kode sampel:
Keluaran:
sumber
Jika Anda ingin menggunakan margin negatif, setel padding yang cukup untuk container dan clipToPaddingnya ke false dan setel margin negatif untuk anak-anaknya sehingga tidak akan memotong tampilan anak!
sumber
Ini mungkin merupakan praktik yang buruk di masa lalu, tetapi dengan Desain Material dan tombol aksi mengambangnya, tampaknya tidak dapat dihindari dan diperlukan dalam banyak kasus sekarang. Pada dasarnya, ketika Anda memiliki dua tata letak terpisah yang tidak dapat Anda masukkan ke dalam RelativeLayout tunggal karena keduanya memerlukan penanganan terpisah yang jelas (pikirkan header dan konten, misalnya), satu-satunya cara untuk tumpang tindih dengan FAB adalah membuatnya menonjol dari salah satunya. tata letak menggunakan margin negatif. Dan ini menciptakan masalah tambahan dengan area yang dapat diklik.
sumber
Bagi saya, dan mengenai pengaturan margin negatif pada TextView (saya menyadari OP mengacu pada ViewGroup, tetapi saya sedang mencari masalah dengan pengaturan margin negatif dan saya mendarat di sini) ... Saya menemukan masalah dengan 4.0.3 ( API 15) HANYA dan pengaturan
android:layout_marginTop
atauandroid:layout_marginBottom
ke nilai negatif seperti -2dp.Untuk beberapa alasan, TextView tidak ditampilkan sama sekali. Tampaknya "hilang" dari tampilan (bukan hanya tak terlihat).
Ketika saya mencoba ini dengan 3 versi layout_margin lainnya, saya tidak melihat masalahnya.
Perhatikan bahwa saya belum mencoba ini di perangkat nyata, ini menggunakan emulator 4.0.3. Ini adalah hal aneh ke-2 yang saya temukan yang hanya memengaruhi 4.0.3, jadi aturan baru saya adalah selalu menguji dengan emulator 4.0.3 :)
Saya berhasil mengurangi margin bawah TextView dengan menggunakan
android:lineSpacingExtra="-2dp"
yang berfungsi meskipun saya kebetulan memilikinyaandroid:singleLine="true"
(jadi saya tidak akan berpikir bahwa spasi baris akan menjadi faktor).sumber
Tidak, sebaiknya jangan gunakan
negative margin
. sebagai gantinya Anda harus menggunakantranslate
. Bahkan jika margin negatif kadang-kadang berfungsi, ketika Anda mengubah tata letak secara terprogram, menerjemahkan akan membantu. Dan tampilan tidak dapat memenuhi layar saat Anda menggunakan margin.sumber
Saya hanya tahu bahwa itu mungkin untuk waktu yang agak singkat. Tapi saya tidak melihat ada masalah dengan itu. Berhati-hatilah dengan ukuran layar dan semacamnya sehingga Anda yakin untuk tidak secara tidak sengaja membuat item yang seharusnya tidak tampak tumpang tindih di layar. (yaitu teks di atas teks kemungkinan besar merupakan ide yang buruk.)
sumber