Aggiungere un margine tra un RadioButton e la sua etichetta in Android?


88

È possibile aggiungere un po 'di spazio tra un RadioButton e l'etichetta mentre si utilizzano ancora i componenti integrati di Android? Per impostazione predefinita, il testo sembra un po 'accartocciato.

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

Ho provato un paio di cose:

  1. Specificare margine e riempimento sembra aggiungere spazio attorno all'intero elemento (pulsante e testo, insieme). Ha senso, ma non fa quello che mi serve.

  2. Creazione di un disegnabile personalizzato tramite XML specificando le immagini per gli stati selezionati e deselezionati, quindi aggiungendo alcuni pixel extra sul lato destro di ciascuna immagine. Dovrebbe funzionare, ma ora esci dall'interfaccia utente predefinita. (Non la fine del mondo, ma non l'ideale)

  3. Aggiungi uno spazio bianco extra all'inizio di ogni etichetta. Android sembra tagliare un carattere di spazio iniziale, come in "My String", ma specificare unicode U + 00A0, come in "\ u00A0My String" fa il trucco. Funziona, ma sembra piuttosto sporco.

Qualche soluzione migliore?

Risposte:


120

Per chiunque legga questo ora, la risposta accettata porterà ad alcuni problemi di layout sulle API più recenti che causano un riempimento eccessivo.

Su API <= 16 è possibile impostare paddingLeftil pulsante di opzione per impostare il riempimento relativo ai limiti di visualizzazione del pulsante di opzione. Inoltre, uno sfondo della patch nove cambia anche i limiti della vista rispetto alla vista.

Su API> = 17 il paddingLeft(o paddingStart) è in relazione al pulsante di opzione disegnabile. Lo stesso vale per circa una patch nove. Per illustrare meglio le differenze di riempimento vedere lo screenshot allegato.

Se scavi nel codice troverai un nuovo metodo nell'API 17 chiamato getHorizontalOffsetForDrawables . Questo metodo viene chiamato quando si calcola il riempimento sinistro per un pulsante di opzione (da qui lo spazio aggiuntivo illustrato nell'immagine).

TL; DR Usa solo paddingLeftse il tuo minSdkVersionè> = 17. Se supporti API <= 16, dovresti avere uno stile di pulsante di opzione per l'SDK minimo che stai supportando e un altro stile per API 17+.

combina screenshot che mostrano le differenze di spaziatura interna a sinistra tra le versioni API


2
api 17 è android.os.Build.VERSION_CODES.JELLY_BEAN_MR1
KarenAnne

11
Il modo migliore per farlo è con una directory "values-v17"; metti la tua dimensione API 17+ in un xml di risorse lì e quella standard per 16 e sotto in semplici "valori".
akent

15
È incredibile come gli sviluppatori / gestori di Google trattino i soliti sviluppatori. Fanno quello che vogliono, quando vogliono. La coerenza e l'integrità non significano nulla per loro.
Yar

66

Non sono sicuro che questo risolverà il tuo problema, ma hai provato la proprietà "Padding left" del pulsante di opzione con un valore di 50dip o più


2
Funziona, e 50dip è necessario per coprire la larghezza del drawable predefinito. All'inizio ho usato 20dip e il testo si è spostato a sinistra! Questo perché il punto di ancoraggio non è il bordo destro del disegnabile; è il bordo sinistro del drawable.
Robert Claypool

58

Ho provato diversi modi e ho finito con questo che funzionava correttamente sia sull'emulatore che sui dispositivi:

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • android: lo sfondo deve essere trasparente come sembra su api10 c'è uno sfondo con imbottiture intrinseche (non provato con altre api ma la soluzione funziona anche su altre)
  • android: il pulsante deve essere nullo perché altrimenti le imbottiture non funzioneranno correttamente
  • android: drawableLeft deve essere specificato al posto di android: button
  • android: drawablePadding è lo spazio che sarà tra il tuo drawable e il tuo testo

4
La migliore risposta! Puoi anche impostare android: background = "@ null" e apparirà come hai dichiarato senza imbottitura.
saiyancoder

2
quando imposto android: button = "@ null", il pulsante di opzione non viene controllato (cliccato). Sto facendo qualcosa di sbagliato. Si prega di aiutare stackoverflow.com/questions/28052820/...
Shirish Herwade

@Shirish questa soluzione non ha nulla a che fare con il tuo pulsante che non viene cliccato. L'ho appena implementato e viene cliccato.
Yar

Grazie per la soluzione!
Vimalathithan Rajasekaran

32

Aggiungere il margine tra un radiobutton la sua etichetta per paddingLeft :

android:paddingLeft="10dip"

Basta impostare la tua imbottitura personalizzata .

Proprietà xml di 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" />

Fatto


22

Utilizza i seguenti attributi XML. Ha funzionato per me

Per API <= 16 utilizzare

android:paddingLeft="16dp"

Per API> = 17 utilizzare

android:paddingStart="@16dp"

Per esempio:

<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" />

inserisci qui la descrizione dell'immagine

Inoltre Altro: l' drawablePaddingattributo non funziona. Funziona solo se hai aggiunto un disegnabile nel tuo pulsante di opzione. Ad esempio:

<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" />

6

Non puoi provarlo adesso per verificare, ma hai provato a vedere se l'attributo android: drawablePadding fa quello che ti serve?


1
Hm. Ho provato e non sembra avere alcun effetto in questa situazione. Grazie per il suggerimento, sicuramente suona proprio dalla descrizione: "Il riempimento tra i disegnabili e il testo".
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());

1

L'imbottitura tra i drawables e il testo. Sarà ottenuto aggiungendo la riga sotto nel file xml. android:drawablePadding="@dimen/10dp"


stavo cercando esattamente questo ... mi ha aiutato molto
Shirish Herwade

2
@dimen/10dpcattiva pratica
Vlad

0

Ho provato, "android: paddingLeft" funzionerà. paddingLeft influirà solo sul testo mentre l'immagine della radio rimarrà nella posizione originale.


-1

"Android: paddingLeft" sembra funzionare correttamente solo con Android 4.2.2

Ho provato quasi tutte le versioni di Android e funziona solo sulla versione 4.2.2.


-1

Sto usando un approccio diverso che penso dovrebbe funzionare su tutte le versioni API. Invece di applicare il riempimento, sto aggiungendo una vista vuota tra i RadioButtons:

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

Questo dovrebbe darti un'imbottitura di 20dp.


-1

Sono venuto qui in cerca di una risposta e il modo più semplice (dopo averci pensato) è stato aggiungere la spaziatura all'inizio dell'etichetta stessa in questo modo

<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" />

-1

per me funziona:

<?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>

-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" />

Considera l'
idea di

-1

Puoi questo codice sul tuo file XML

<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" />

o usalo nella lezione di attività

radioButton.setPadding(12, 10, 0, 10);

-1

Crea uno stile in style.xml come questo

<style name="Button.Radio">

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

Metti quello stile nel pulsante di opzione

 <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"/>

È possibile modificare qualsiasi attributo come il pulsante poiché RadioButton eredita indirettamente il pulsante.


-1

So che è una vecchia domanda, ma con questa soluzione, finalmente ho avuto la tranquillità e mi sono dimenticato del livello API.

RadioGroup verticale lato sinistro con vista testo verticale lato destro.

 <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>

@Mark Buikema, Assolutamente non è un'etichetta, ma qui funziona come un'etichetta! Se desideri etichette di clic, puoi aggiungere listener di clic a TextView. Il punto è, dobbiamo implementare il layout per ogni versione del sistema operativo Android? Penso che nessuno.
Stanley Kou

-1

Potresti provare a utilizzare l'attributo gravità del pulsante di opzione.

<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" />

Questo allineerà il testo all'estremità più a destra. Guarda la prima radio nell'immagine.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.