Saya menggunakan FloatingActionButton baru dari Google Design Library dan saya mendapatkan beberapa masalah padding / margin yang aneh. Gambar ini (dengan opsi tata letak pengembang aktif) berasal dari API 22.
Dan dari API 17.
Ini adalah XML
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_gravity="bottom|right"
android:layout_marginLeft="16dp"
android:layout_marginRight="20dp"
android:layout_marginTop="-32dp"
android:src="@drawable/ic_action_add"
app:fabSize="normal"
app:elevation="4dp"
app:borderWidth="0dp"
android:layout_below="@+id/header"/>
Mengapa FAB di API 17 jauh lebih besar dari segi padding / margin?
CoordinatorLayout
untuk menyelaraskannya secara vertikal dan mengamati bantalan ekstra pra-lollipop. Anda dapat mengetahuinya dari sumber FAB yang didekompilasi, tetapi saya lebih suka menunggu Google memperbaikinya seperti yang mereka lakukanCardView
.Jawaban:
Pembaruan (Okt 2016):
Solusi yang tepat sekarang adalah memasukkan
app:useCompatPadding="true"
FloatingActionButton Anda. Ini akan membuat padding konsisten di antara berbagai versi API. Namun, ini tampaknya masih membuat margin default sedikit berkurang, jadi Anda mungkin perlu menyesuaikannya. Tapi setidaknya tidak diperlukan lagi gaya khusus API.Jawaban sebelumnya:
Anda dapat melakukannya dengan mudah menggunakan gaya khusus API. Dalam keadaan normal Anda
values/styles.xml
, letakkan sesuatu seperti ini:dan kemudian di bawah values-v21 / styles.xml, gunakan ini:
dan terapkan gaya ke FloatingActionButton Anda:
Seperti yang telah dicatat orang lain, dalam API <20, tombol menampilkan bayangannya sendiri, yang menambah lebar logis keseluruhan tampilan, sedangkan di API> = 20 menggunakan parameter Elevasi baru yang tidak berkontribusi pada lebar tampilan.
sumber
elevation
Anda atur di FAB.app:useCompatPadding="true"
Tidak perlu lagi mengutak - atik
styles.xml
atau dengan.java
file. Biarkan saya membuatnya sederhana.Margin / padding ekstra yang Anda lihat di FAB di gambar kedua Anda disebabkan oleh compatPadding ini pada perangkat pra-lollipop . Jika properti ini tidak disetel, properti ini akan diterapkan di perangkat pra-lollopop dan BUKAN di perangkat lollipop +.
Bukti dari konsep
sumber
setelah beberapa waktu mencari dan menguji solusi, saya memperbaiki masalah saya dengan menambahkan baris ini ke hanya tata letak xml saya:
dan ini adalah seluruh tata letak tombol float saya
sumber
useCompatPadding
ada yang lain mendapatkan hasil yang sama.Ada masalah dalam Pustaka Dukungan Desain. Gunakan metode di bawah ini untuk memperbaiki masalah ini sampai perpustakaan diperbarui. Coba tambahkan kode ini ke aktivitas atau fragmen Anda untuk menyelesaikan masalah. Jaga agar xml Anda tetap sama. Di lollipop ke atas tidak ada margin tapi di bawah ada margin 16dp.
Perbarui Contoh Kerja
XML - FAB ada di dalam RelativeLayout
Jawa
Ubah dp ke px
Lollipop
Pra Lollipop
sumber
RelativeLayout.LayoutParams
tidak dapat dilemparkan keLayoutParams
dariFloatingActionButton
dan saya tidak melihat margin 16 dp pada pra Lollipop. LebarFloatingActionButton
pre Lollipop adalah 84dp bukan 56dp dan tingginya 98dp.View.getLayoutParams
mengembalikanLayoutParams
jenisView
is in - dalam kasus Eugene, ini adalah aRelativeLayout.LayoutParams
.Pada pra Lollipop
FloatingActionButton
bertanggung jawab untuk menggambar bayangannya sendiri. Oleh karena itu, tampilan harus sedikit lebih besar untuk memberi ruang bagi bayangan. Untuk mendapatkan perilaku yang konsisten, Anda dapat mengatur margin untuk memperhitungkan perbedaan tinggi dan lebar. Saya saat ini menggunakan kelas berikut :Pembaruan: Pustaka Dukungan Android v23 mengganti nama fab_size dimens menjadi:
sumber
Jawaban Markus bekerja dengan baik untuk saya setelah memperbarui ke v23.1.0 dan membuat beberapa penyesuaian pada impor (dengan plugin gradle terbaru kami menggunakan aplikasi R kami alih-alih R perpustakaan desain). Berikut adalah kode untuk v23.1.0:
sumber
Dalam file layout, setel elevasi atribut ke 0. karena dibutuhkan elevasi default.
Sekarang dalam aktivitas, periksa level api yang lebih besar dari 21 dan setel elevasi jika perlu.
sumber