Saya ingin memiliki Tombol Android dengan ikon + teks di tengahnya. Saya menggunakan atribut drawableLeft untuk mengatur gambar, ini berfungsi dengan baik jika tombol memiliki lebar "wrap_content"
tetapi saya perlu meregangkan ke lebar maksimal jadi saya menggunakan lebar "fill_parent"
. Ini memindahkan ikon saya langsung ke kiri tombol dan saya ingin ikon dan teks terpusat di dalam tombol.
Saya sudah mencoba menyiapkan padding tetapi ini hanya memungkinkan untuk memberikan nilai tetap sehingga bukan itu yang saya butuhkan. Saya perlu ikon + teks sejajar di tengah.
<Button
android:id="@+id/startTelemoteButton"
android:text="@string/start_telemote"
android:drawableLeft="@drawable/start"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:width="fill_parent"
android:heigh="wrap_content" />
Ada saran tentang bagaimana saya bisa mencapai itu?
android
android-layout
user-interface
button
alignment
jloriente.dll
sumber
sumber
Jawaban:
android: drawableLeft selalu menjaga android: paddingLeft sebagai jarak dari batas kiri. Jika tombol tidak disetel ke android: width = "wrap_content", tombol akan selalu menggantung di kiri!
Dengan Android 4.0 (API level 14) Anda bisa menggunakan atribut android: drawableStart untuk menempatkan drawable di awal teks. Satu-satunya solusi kompatibel mundur yang saya buat adalah menggunakan ImageSpan untuk membuat Text + Image Spannable:
Dalam kasus saya, saya juga perlu menyesuaikan android: atribut gravitasi Tombol agar terlihat di tengah:
sumber
button.setText(buttonLabel)
Saya tahu saya terlambat menjawab pertanyaan ini, tetapi ini membantu saya:
Saya menemukan solusi ini dari sini: UI Android berjuang: membuat tombol dengan teks dan ikon di tengah
sumber
Saya menggunakan LinearLayout, bukan Button . The OnClickListener , yang saya butuhkan untuk penggunaan bekerja dengan baik juga untuk LinearLayout.
sumber
Semua jawaban sebelumnya sepertinya sudah ketinggalan zaman
Anda dapat menggunakan
MaterialButton
now yang memungkinkan pengaturan gravitasi ikon.Untuk menggunakan komponen material, Anda jelas perlu:
Tambahkan ketergantungan
implementation 'com.google.android.material:material:1.3.0-alpha01'
(gunakan versi terbaru)Buat tema Anda memperluas tema Material Components
Jika Anda tidak dapat melakukannya, perluas dari tema Material Bridge
sumber
Saya menyesuaikannya dengan menambahkan padding kiri dan kanan sebagai berikut:
sumber
Saya baru-baru ini mengalami masalah yang sama. Mencoba menemukan solusi yang lebih murah jadi munculkan ini.
Kemudian hanya memanggil
OnClickListener
padaLinearLayout
.Semoga ini membantu seseorang karena sepertinya masalah yang sangat umum. :)
sumber
Anda dapat menggunakan tombol khusus yang mengukur dan menggambar dirinya sendiri untuk mengakomodasi drawable kiri. Temukan contoh dan penggunaannya di sini
Pemakaian
sumber
Ini adalah solusi yang saya tulis 3 tahun yang lalu. Tombol memiliki teks dan ikon kiri dan berada dalam bingkai yang merupakan tombol sebenarnya di sini dan dapat direntangkan oleh fill_parent. Saya tidak dapat mengujinya lagi tetapi berfungsi saat itu. Mungkin Tombol tidak harus digunakan dan dapat diganti dengan TextView tetapi saya tidak akan mengujinya sekarang dan tidak terlalu banyak mengubah fungsi di sini.
sumber
Saya tahu pertanyaan ini sedikit lebih tua, tetapi mungkin Anda masih terbuka untuk mendapatkan petunjuk atau solusi:
Buat RelativeLayout "wrap_content" dengan gambar tombol sebagai latar belakang atau tombol itu sendiri sebagai elemen pertama tata letak. Dapatkan LinearLayout dan setel ke "layout_centerInParent" dan "wrap_content". Kemudian atur Drawable Anda sebagai Imageview. Terakhir, atur TextView dengan teks Anda (lokal).
jadi pada dasarnya Anda memiliki struktur ini:
atau seperti ini:
Saya tahu dengan solusi ini ada banyak elemen yang harus ditangani, tetapi Anda dapat membuat tombol kustom Anda sendiri dengan sangat mudah dan juga mengatur posisi teks dan drawable yang tepat :)
sumber
Cara saya mengatasinya melibatkan mengelilingi tombol dengan
<View ../>
elemen ringan yang mengubah ukuran secara dinamis. Di bawah ini adalah beberapa contoh yang dapat dicapai dengan ini:Perhatikan bahwa area tombol yang dapat diklik di contoh 3 sama dengan di 2 (yaitu dengan spasi), yang berbeda dari contoh 4 di mana tidak ada celah "yang tidak bisa diklik" di antaranya.
Kode:
sumber
Coba gunakan perpustakaan ini
OmegaCenterIconButton
sumber
Anda dapat membuat widget khusus:
Tombol kelas Java:
}
Tata letak ibutton.xml
Untuk menggunakan widget khusus ini:
Anda harus memberikan namespace untuk atribut khusus xmlns: ibutton = "http://schemas.android.com/apk/res/com.test.android.xxx" di mana com.test.android.xxx adalah paket root dari aplikasi.
Letakkan saja di bawah xmlns: android = "http://schemas.android.com/apk/res/android".
Hal terakhir yang Anda perlukan adalah atribut khusus di attrs.xml.
Di attrs.xml
Untuk pemosisian yang lebih baik, gabungkan Tombol khusus di dalam LinearLayout, jika Anda ingin menghindari potensi masalah dengan pemosisian RelativeLayout.
Nikmati!
sumber
Memiliki masalah serupa tetapi ingin memiliki drawable tengah tanpa teks dan tata letak yang dibungkus. Solusinya adalah membuat tombol khusus dan menambahkan satu lagi drawable selain KIRI, KANAN, ATAS, BAWAH. Seseorang dapat dengan mudah mengubah penempatan drawable dan menempatkannya pada posisi yang diinginkan relatif terhadap teks.
CenterDrawableButton.java
attrs.xml
pemakaian
sumber
Letakkan FrameLayout di LinearLayout dan atur orientasi ke Horizontal.
sumber
Anda dapat meletakkan tombol di atas LinearLayout
sumber
Apa yang terjadi jika Anda mencoba android: gravity = "center_horizontal"?
sumber
Saya pikir android: gravity = "center" seharusnya berfungsi
sumber
Seperti yang disarankan oleh Rodja, sebelum 4.0 tidak ada cara langsung untuk memusatkan teks dengan drawable. Dan memang menyetel nilai padding_left tidak akan menjauhkan drawable dari batas. Oleh karena itu, saran saya adalah pada saat runtime Anda menghitung dengan tepat berapa banyak piksel dari batas kiri yang dibutuhkan drawable Anda dan kemudian meneruskannya menggunakan setPadding Perhitungan Anda mungkin seperti
Lebar drawable Anda tetap dan Anda dapat mencarinya dan Anda juga dapat menghitung atau menebak lebar teks.
Terakhir, Anda perlu menggandakan nilai padding berdasarkan kepadatan layar, yang dapat Anda lakukan menggunakan DisplayMetrics
sumber
Saya tidak mengujinya tetapi tampaknya Anda dapat menggunakan perpustakaan CenteredContentButton
sumber
kelas publik DrawableCenterTextView memperluas TextView {
}
sumber
Perbaikan kotor.
Menentukan padding yang tepat menyelesaikan tujuan. Namun, untuk layar yang bervariasi, gunakan padding yang berbeda dan letakkan di sumber daya dimens di folder nilai masing-masing.
sumber
Gunakan RelativeLayout (container) dan android: layout_centerHorizontal = "true" , contoh saya:
sumber
Kemungkinan lain untuk mempertahankan tema Tombol.
Dengan solusi ini jika Anda menambahkan @ color / your_color @ color / your_highlight_color di tema aktivitas Anda, Anda dapat memiliki tema Matherial di Lollipop dengan bayangan dan riak, dan untuk tombol datar versi sebelumnya dengan warna dan sorot coor saat Anda menekannya.
Apalagi dengan solusi ini autoresize gambar
Hasil: Pertama pada perangkat Lollipop Kedua: Pada perangkat pra-lollipop 3: Tombol tekan perangkat pra-lollipop
sumber
Saya telah memusatkan
textView
dengan ikon menggunakanpaddingLeft
dan dan menyelaraskan textView ke kiri | centerVertical . dan untuk celah kecil antara tampilan dan ikon yang saya gunakandrawablePadding
sumber
android:paddingLeft
berfungsi.Ini mungkin utas lama / tertutup tetapi saya telah mencari di mana-mana tidak menemukan sesuatu yang berguna, sampai saya memutuskan untuk membuat solusi saya sendiri. Jika ada orang di sini yang mencoba mencari jawaban, coba yang ini, mungkin menghemat waktu Anda berpikir
Karena Linear layout bertindak sebagai container dan orang yang memiliki selector, ketika Anda mengklik seluruh linear layout akan terlihat seperti apa seharusnya. jika Anda ingin keduanya berada di tengah, gunakan insteaf relatif. Jika Anda ingin memusatkan horizontal, ubah orientasi menjadi horizontal.
Perhatikan JANGAN lupa untuk menambahkan android: clickable = "true" ke penampung utama Anda (relatif atau linier) agar tindakan tersebut terjadi.
Sekali lagi ini mungkin utas lama tetapi masih dapat membantu seseorang di sana.
-selamat berharap ini membantu- happycodings.
sumber
Jika Anda menggunakan salah satu solusi tampilan kustom , berhati-hatilah, karena solusi tersebut sering gagal pada teks panjang atau multiline . Saya menulis ulang beberapa jawaban, mengganti
onDraw()
dan memahami bahwa itu adalah cara yang salah.sumber
Saya telah melihat solusi untuk menyelaraskan drawable di awal / kiri tetapi tidak ada solusi untuk drawable end / kanan, jadi saya menemukan solusi ini. Ini menggunakan bantalan yang dihitung secara dinamis untuk menyelaraskan gambar dan teks di sisi kiri dan kanan.
Penting untuk menyetel gravitasi dalam tata letak Anda ke "center_vertical | start" atau "center_vertical | end" tergantung di mana Anda menyetel ikon. Sebagai contoh:
Satu-satunya masalah dengan implementasi ini adalah tombol hanya dapat memiliki satu baris teks, jika tidak, area teks akan mengisi tombol dan paddings akan menjadi 0.
sumber
Gunakan ini
android:background="@drawable/ic_play_arrow_black_24dp"
cukup atur latar belakang ke ikon yang ingin Anda pusatkan
sumber