web-dev-qa-db-fra.com

Ajouter une marge entre un bouton radio et son étiquette sous Android?

Est-il possible d'ajouter un peu d'espace entre un bouton radio et l'étiquette tout en utilisant les composants intégrés d'Android? Par défaut, le texte est un peu plissé.

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

J'ai essayé plusieurs choses:

  1. La spécification de la marge et du remplissage semble ajouter de l'espace autour de l'élément tout entier (bouton et texte ensemble). Cela a du sens, mais ne fait pas ce dont j'ai besoin.

  2. Créer un dessin personnalisable via XML en spécifiant des images pour les états coché et non coché, puis en ajoutant quelques pixels supplémentaires sur le côté droit de chaque image. Cela devrait fonctionner, mais maintenant vous sortez de l'interface utilisateur par défaut. (Pas la fin du monde, mais pas idéal)

  3. Ajoutez des espaces supplémentaires au début de chaque étiquette. Android semble couper un caractère d'espacement, comme dans "My String", mais spécifier unicode U + 00A0, comme dans "\ u00A0My String" fait l'affaire. Cela fonctionne, mais cela semble un peu sale.

Des solutions meilleures?

69
allclaws

Pour tous ceux qui lisent ceci maintenant. La réponse acceptée conduira à des problèmes de mise en page sur les nouveaux API, causant trop de bourrage. 

Sur l'API <= 16, vous pouvez définir le remplissage à gauche du bouton radio pour définir le remplissage par rapport aux limites de vue du bouton. De plus, un arrière-plan de neuf correctifs modifie également les limites de la vue par rapport à la vue.

Sur l'API 17, le remplissage à gauche est associé au bouton radio que vous pouvez dessiner. Il en va de même pour le patch neuf environ. Pour mieux illustrer les différences de remplissage, voir la capture d'écran ci-jointe. 

Si vous creusez dans le code, vous trouverez une nouvelle méthode dans api 17 appelée getHorizontalOffsetForDrawables . Cette méthode est appelée lors du calcul du remplissage à gauche d'un bouton radio (d'où l'espace supplémentaire illustré dans l'image).

TL; DR Vous devriez avoir le style de bouton radio pour le sdk min que vous supportez et un autre style pour api 17+

combine screen shots showing left padding differences between api versions

98
Jim Baca

Vous ne savez pas si cela résoudra votre problème, mais avez-vous essayé la propriété "Padding left" de Radio Button avec une valeur de 50dip ou plus

60
user438650

j'ai essayé plusieurs manières et j'ai fini avec celui-ci fonctionnant correctement sur l'émulateur et les périphériques:

    <RadioButton
        Android:background="@Android:color/transparent"
        Android:button="@null"
        Android:drawableLeft="@drawable/your_own_selector"
        Android:drawablePadding="@dimen/your_spacing" />
  • Android: background doit être transparent, comme il semble sur api10, il existe un fond avec des rembourrages intrinsèques (non essayé avec d'autres apis mais la solution fonctionne aussi sur d'autres)
  • Android: button doit être null car les rembourrages ne fonctionneront pas correctement sinon
  • Android: drawableLeft doit être spécifié à la place de Android: button
  • Android: drawablePadding est l'espace entre votre drawable et votre texte
55
Gianluca P.

Ajouter margin between radiobutton its label by paddingLeft

Android:paddingLeft="10dip"

Il suffit de définir votre padding .

La propriété XML de 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" />

Terminé

28
Hiren Patel

Utilisez les attributs XML suivants. Ça a fonctionné pour moi

Pour API <= 16, utilisez

Android:paddingLeft="16dp"

Pour API> = 17 utilisation

Android:paddingStart="@16dp"

Par exemple:

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

 enter image description here

De plus, l'attribut drawablePadding ne fonctionne pas. Cela ne fonctionne que si vous avez ajouté un dessin dans votre bouton radio. Par exemple:

<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" />
19
Srikar Reddy

Vous ne pouvez pas essayer ceci maintenant pour vérifier, mais avez-vous essayé de voir si l'attribut Android: drawablePadding fait ce qu'il vous faut?

5
Mark B
final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),

    checkBox.getPaddingTop(),
    checkBox.getPaddingRight(),
    checkBox.getPaddingBottom());
4
Dilavar M

Le remplissage entre les tirables et le texte. Cela sera réalisé en ajoutant la ligne ci-dessous dans le fichier xml . Android:drawablePadding="@dimen/10dp" 

1
Faakhir

Créez un style dans style.xml comme ceci

<style name="Button.Radio">

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

Mettez ce style dans le bouton 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"/>

Vous pouvez modifier n'importe quel attribut sous la forme d'un bouton, car RadioButton hérite indirectement du bouton.

0

"Android: paddingLeft" ne semble fonctionner correctement que sous Android 4.2.2

j'ai essayé presque toutes les versions d'Android et cela ne fonctionne que sur la version 4.2.2.

0
Lowerland

Utiliser la gravité 

            Android:gravity="center_horizontal|center_vertical"
0
Hossam Gamal

Je suis venu ici à la recherche d'une réponse et la manière la plus simple (après réflexion) consistait à ajouter un espacement au début de l'étiquette elle-même, comme

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

pour moi ça marche:

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

Vous pouvez ce code sur votre fichier 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" />

ou utilisez ceci sur la classe d'activité

radioButton.setPadding(12, 10, 0, 10);
0
<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" />
0
Dhaval Shingala

Vous pouvez essayer d’utiliser l’attribut gravité du bouton 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" />

Cela alignera le texte à l'extrême droite. Découvrez la première radio de l'image.

 enter image description here

0
Salil Kaul

J'ai essayé, "Android: paddingLeft" va fonctionner. paddingLeft aura uniquement un impact sur le texte tout en conservant l'image radio restée à sa position d'origine.

0
David Guo