Tambahkan margin antara RadioButton dan labelnya di Android?

90

Apakah mungkin menambahkan sedikit ruang antara RadioButton dan label sambil tetap menggunakan komponen bawaan Android? Secara default, teks terlihat sedikit berkerut.

<RadioButton android:id="@+id/rb1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="My Text"/>

Saya sudah mencoba beberapa hal:

  1. Menentukan margin dan padding tampaknya menambah spasi di sekitar seluruh elemen (tombol dan teks, bersama-sama). Itu masuk akal, tapi tidak melakukan apa yang saya butuhkan.

  2. Membuat drawable khusus melalui XML yang menentukan gambar untuk status dicentang dan tidak dicentang, lalu menambahkan beberapa piksel ekstra ke sisi kanan setiap gambar. Ini seharusnya berfungsi, tetapi sekarang Anda melangkah keluar dari UI default. (Bukan akhir dunia, tapi tidak ideal)

  3. Tambahkan spasi ekstra ke awal setiap label. Android tampaknya memangkas karakter spasi utama, seperti dalam "My String", tetapi menentukan unicode U + 00A0, seperti dalam "\ u00A0My String" dapat membantu. Ini berfungsi, tetapi tampaknya agak kotor.

Ada solusi yang lebih baik?

allclaws
sumber

Jawaban:

121

Bagi siapa pun yang membaca ini sekarang, jawaban yang diterima akan menyebabkan beberapa masalah tata letak pada API yang lebih baru yang menyebabkan terlalu banyak padding.

Pada API <= 16 Anda dapat mengatur paddingLeftpada tombol radio untuk mengatur padding relatif terhadap batas tampilan tombol radio. Selain itu, latar belakang tambalan sembilan juga mengubah batas tampilan relatif terhadap tampilan.

Pada API> = 17, paddingLeft(atau paddingStart) terkait dengan drawable tombol radio. Hal yang sama berlaku untuk tentang patch sembilan. Untuk lebih menggambarkan perbedaan padding, lihat tangkapan layar terlampir.

Jika Anda menggali kode, Anda akan menemukan metode baru di API 17 yang disebut getHorizontalOffsetForDrawables . Metode ini dipanggil saat menghitung padding kiri untuk tombol radio (karena itu ruang tambahan diilustrasikan dalam gambar).

TL; DR Cukup gunakan paddingLeftjika Anda minSdkVersion> = 17. Jika Anda mendukung API <= 16, Anda harus memiliki gaya tombol radio untuk SDK min yang Anda dukung dan gaya lain untuk API 17+.

gabungkan tangkapan layar yang menunjukkan perbedaan padding kiri antara versi API

Jim Baca
sumber
2
api 17 adalah android.os.Build.VERSION_CODES.JELLY_BEAN_MR1
KarenAnne
11
Cara terbaik untuk melakukannya adalah dengan direktori "values-v17"; letakkan dimensi API 17+ Anda dalam xml sumber daya di sana dan yang standar untuk 16 dan di bawahnya hanya dalam "nilai" biasa.
akent
16
Luar biasa bagaimana pengembang / manajemen Google memperlakukan kami sebagai pengembang biasa. Mereka melakukan apapun yang mereka inginkan, kapanpun mereka mau. Konsistensi dan integritas tidak berarti apa-apa bagi mereka.
Yar
66

Tidak yakin apakah ini akan menyelesaikan masalah Anda, tetapi sudahkah Anda mencoba properti "Padding left" Radio Button dengan nilai 50dip atau lebih

pengguna438650
sumber
2
Ini berfungsi, dan diperlukan 50dip untuk menutupi lebar drawable default. Awalnya saya menggunakan 20dip dan teksnya pindah ke kiri! Itu karena titik jangkar bukanlah tepi kanan drawable; itu adalah tepi kiri drawable.
Robert Claypool
58

Saya mencoba beberapa cara dan selesai dengan yang ini berfungsi dengan benar pada emulator dan perangkat:

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • android: background harus transparan karena tampaknya di api10 ada background dengan paddings intrinsik (tidak dicoba dengan apis lain tetapi solusinya bekerja pada yang lain juga)
  • android: button harus null karena paddings tidak akan berfungsi dengan benar jika tidak
  • android: drawableLeft harus ditentukan, bukan android: button
  • android: drawablePadding adalah ruang di antara drawable dan teks Anda
Gianluca P.
sumber
4
Jawaban terbaik! Anda juga dapat menyetel android: background = "@ null" dan akan terlihat seperti yang Anda nyatakan tanpa padding.
saiyancoder
2
ketika saya menyetel android: button = "@ null", tombol radio tidak dicentang (diklik). Saya melakukan sesuatu yang salah. tolong bantu stackoverflow.com/questions/28052820/…
Shirish Herwade
@Shirish solusi ini tidak ada hubungannya dengan tombol Anda yang tidak diklik. Saya baru saja menerapkannya dan diklik.
Yar
Terima kasih atas solusinya!
Vimalathithan Rajasekaran
33

Menambahkan marjin antara radiobutton yang label oleh paddingLeft :

android:paddingLeft="10dip"

Cukup atur padding kustom Anda .

Properti xml RadioButton.

<RadioButton
    android:id="@+id/radHighest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:button="@drawable/YourImageResource"
    android:drawablePadding="50dp"
    android:paddingLeft="10dip"
    android:text="@string/txt_my_text"
    android:textSize="12sp" />

Selesai

Hiren Patel
sumber
22

Gunakan atribut XML berikut. Itu berhasil untuk saya

Untuk API <= 16 digunakan

android:paddingLeft="16dp"

Untuk API> = 17 digunakan

android:paddingStart="@16dp"

Misalnya:

<android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/popularityRadioButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="true"
        android:paddingEnd="@dimen/radio_button_text"
        android:paddingLeft="@dimen/radio_button_text"
        android:paddingRight="@dimen/radio_button_text"
        android:paddingStart="@dimen/radio_button_text"
        android:text="Popularity"
        android:textSize="@dimen/sort_dialog_text_size"
        android:theme="@style/AppTheme.RadioButton" />

masukkan deskripsi gambar di sini

Lebih jauh lagi: drawablePaddingatribut tidak berfungsi. Ini hanya berfungsi jika Anda menambahkan drawable di tombol radio Anda. Misalnya:

<RadioButton
    android:id="@+id/radioButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:button="@null"
    android:drawableEnd="@android:drawable/btn_radio"
    android:drawablePadding="56dp"
    android:drawableRight="@android:drawable/btn_radio"
    android:text="New RadioButton" />
Srikar Reddy
sumber
6

Tidak dapat mencoba ini sekarang untuk memverifikasi, tetapi apakah Anda sudah mencoba untuk melihat apakah atribut android: drawablePadding sesuai dengan yang Anda butuhkan?

Mark B
sumber
1
Hm. Cobalah dan tampaknya tidak berpengaruh apa pun dalam situasi ini. Terima kasih atas sarannya, ini pasti terdengar langsung dari deskripsi: "Padding antara drawable dan teks".
allclaws
4
final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),

    checkBox.getPaddingTop(),
    checkBox.getPaddingRight(),
    checkBox.getPaddingBottom());
Dilavar Malek
sumber
1

Padding antara drawable dan teks. Ini akan dicapai dengan menambahkan baris di bawah ini dalam file xml. android:drawablePadding="@dimen/10dp"

Faakhir
sumber
saya mencari persis untuk ini ... banyak membantu saya
Shirish Herwade
2
@dimen/10dppraktik buruk
Vlad
0

Saya sudah mencoba, "android: paddingLeft" akan berfungsi. paddingLeft hanya akan mempengaruhi teks sementara gambar radio tetap pada posisi aslinya.

David Guo
sumber
-1

"Android: paddingLeft" sepertinya hanya berfungsi dengan benar pada android 4.2.2

Saya telah mencoba hampir semua versi android dan hanya bekerja pada versi 4.2.2.

Dataran rendah
sumber
-1

Saya menggunakan pendekatan berbeda yang menurut saya harus berfungsi pada semua versi API. Alih-alih menerapkan padding, saya menambahkan tampilan kosong antara ke RadioButtons:

<View
        android:layout_width="20dp"
        android:layout_height="1dp" />

Ini akan memberi Anda bantalan 20dp.

Oren Bengigi
sumber
-1

Saya datang ke sini mencari jawaban dan cara paling sederhana (setelah beberapa pemikiran) adalah menambahkan spasi di awal label itu sendiri seperti itu

<RadioGroup
     android:orientation="horizontal"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignRight="@+id/btnChangeMode"
     android:layout_marginTop="10dp"
     android:layout_marginBottom="10dp"
     android:layout_below="@+id/view3"
     android:gravity="center|left"
     android:id="@+id/ledRadioGroup">
<RadioButton
         android:button="@drawable/custom_radio_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text=" On"
         android:layout_marginRight="6dp"
         android:id="@+id/ledon"
         android:textColor="@color/white" />
<RadioButton
         android:button="@drawable/custom_radio_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text=" Off"
         android:layout_marginLeft="6dp"
         android:id="@+id/ledoff"
         android:textColor="@color/white" />
percikan
sumber
-1

untuk saya bekerja:

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true">
            <layer-list>
                <item android:right="5dp">
                    <shape android:paddingLeft="5dp" android:shape="oval">
                     <size android:width="20dp" android:height="20dp" />
                     <solid android:color="@color/blue" />
            </shape>
        </item>
    </layer-list>
</item>
<item android:paddingLeft="5dp" android:state_checked="false">
    <layer-list>
        <item android:right="5dp">
            <shape android:paddingLeft="5dp" android:shape="oval">
                <size android:width="20dp" android:height="20dp" />
                <solid android:color="@color/grey" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>
Vadim
sumber
-1
<RadioButton
                android:id="@+id/rb1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:background="@null"
                android:paddingLeft="20dp"
                android:text="1"
                android:textColor="@color/text2"
                android:textSize="16sp"
                android:textStyle="bold" />
Dhaval Shingala
sumber
Pertimbangkan untuk menambahkan beberapa komentar untuk menjelaskan bagaimana ini menyelesaikan masalah;)
DeadlyJesus
-1

Anda dapat kode ini pada file XML Anda

<RadioButton
android:id="@+id/rButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="50dp"
android:paddingLeft="10dip"
android:text="@string/your_text" />

atau gunakan ini di kelas Aktivitas

radioButton.setPadding(12, 10, 0, 10);
Faxriddin Abdullayev
sumber
-1

Buat gaya dalam style.xml seperti ini

<style name="Button.Radio">

    <item name="android:paddingLeft">@dimen/spacing_large</item>
    <item name="android:textSize">16sp</item>
</style>

Letakkan gaya itu di tombol radio

 <RadioButton
                android:id="@+id/rb_guest_busy"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:text="@string/guest_is_waiting"
                android:textSize="@dimen/font_size_3x_medium"
                android:drawablePadding="@dimen/spacing_large"
                android:textColor="@color/color_text_heading_dark"
                style="@style/Button.Radio"/>

Anda dapat mengubah atribut apa pun yang sama seperti tombol karena RadioButton secara tidak langsung mewarisi tombol.

Vindhya Pratap Singh
sumber
-1

Saya tahu ini adalah pertanyaan lama, tetapi dengan solusi ini, saya akhirnya merasa tenang dan melupakan API level.

RadioGroup vertikal sisi kiri dengan tampilan teks vertikal sisi kanan.

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical">
        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RadioGroup>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center_vertical"
            android:text="Radio 1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center_vertical"
            android:text="Radio 2"/>
    </LinearLayout>
</LinearLayout>
Stanley Kou
sumber
@Mark Buikema, Tentu saja ini bukan label, tetapi berfungsi seperti label di sini! Jika Anda ingin label klik, Anda dapat menambahkan listener klik ke TextView. Maksud saya adalah, apakah kita perlu mengimplementasikan layout untuk setiap versi os android? Saya pikir tidak.
Stanley Kou
-1

Anda dapat mencoba menggunakan atribut gravitasi tombol radio.

<RadioButton
                        android:id="@+id/rb_all"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:checked="true"
                        android:gravity="right|center_vertical"
                        android:padding="@dimen/padding_30dp"
                        android:text="@string/filter_inv_all"
                        android:textColor="@color/black"
                        android:textSize="@dimen/text_size_18" />

Ini akan meratakan teks ke ujung paling kanan. Lihat radio pertama di gambar.

masukkan deskripsi gambar di sini

Salil Kaul
sumber