94 votes

Ajouter une marge entre un RadioButton et son étiquette dans 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 écrasé.

<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 entier (bouton et texte, ensemble). C'est logique, mais cela ne répond pas à mes besoins.

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

  3. Ajoutez un espace supplémentaire au début de chaque étiquette. Android semble couper un caractère d'espace en tête, comme dans " My String", mais en spécifiant l'unicode U+00A0, comme dans " \u00A0My String" fait l'affaire. Cela fonctionne, mais ça semble un peu sale.

De meilleures solutions ?

125voto

James Baca Points 1674

Pour tous ceux qui lisent ceci maintenant, la réponse acceptée entraînera des problèmes de mise en page sur les API plus récentes en raison d'un remplissage trop important.

Sur API <= 16, vous pouvez définir paddingLeft sur le bouton radio pour définir le remplissage par rapport aux limites d'affichage du bouton radio. En outre, un patch neuf d'arrière-plan modifie également les limites de la vue par rapport à la vue.

Sur API >= 17, le paddingLeft (ou paddingStart ) est en relation avec le bouton radio à dessiner. Il en va de même pour le patch neuf. Pour mieux illustrer les différences de rembourrage, voir la capture d'écran ci-jointe.

Si vous creusez dans le code, vous trouverez une nouvelle méthode dans l'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 Utilisez simplement paddingLeft si votre minSdkVersion est >= 17. Si vous prenez en charge l'API <= 16, vous devez avoir un style de bouton radio pour le min SDK que vous prenez en charge et un autre style pour l'API 17+.

combine screenshots showing left padding differences between API versions

2 votes

Api 17 est Android.os.Build.VERSION_CODES.JELLY_BEAN_MR1

11 votes

La meilleure façon de procéder est de créer un répertoire "values-v17" ; placez-y votre dimension API 17+ dans un fichier xml de ressources et la dimension standard pour 16 et moins dans le simple "values".

19 votes

C'est étonnant de voir comment les développeurs et la direction de Google traitent les développeurs habituels. Ils font ce qu'ils veulent, quand ils le veulent. La cohérence et l'intégrité ne signifient rien pour eux.

68voto

user438650 Points 361

Je ne sais pas si cela va résoudre votre problème, mais avez-vous essayé la propriété "Padding left" du bouton radio avec une valeur de 50dip ou plus ?

2 votes

Cela fonctionne, et 50dip est nécessaire pour couvrir la largeur du drawable par défaut. Au début, j'ai utilisé 20dip et le texte s'est déplacé vers la gauche ! C'est parce que le point d'ancrage n'est pas le bord droit du dessinable, mais le bord gauche du dessinable.

58voto

Gianluca P. Points 459

J'ai essayé plusieurs méthodes et j'ai fini avec celle-ci qui fonctionne correctement sur l'émulateur et les appareils :

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • Android:arrière-plan doit être transparent car il semble que sur l'api10 il y a un fond avec des paddings intrinsèques (pas essayé avec d'autres apis mais la solution fonctionne sur d'autres aussi)
  • Android:bouton doit être null car les paddings ne fonctionneront pas correctement sinon
  • Android:drawableLeft doit être spécifié à la place de Android:bouton
  • Android:drawablePadding est l'espace qui se trouvera entre votre dessin et votre texte.

4 votes

La meilleure réponse ! Vous pouvez également définir Android:background="@null" et vous obtiendrez le même résultat, sans remplissage.

2 votes

Lorsque je configure Android:button="@null", le bouton radio n'est pas coché (cliqué). Je fais quelque chose de mal. stackoverflow.com/questions/28052820/

0 votes

@Shirish cette solution n'a rien à voir avec le fait que votre bouton ne soit pas cliqué. Je viens de l'implémenter et il est cliqué.

6voto

mbaird Points 31293

Je ne peux pas l'essayer maintenant pour vérifier, mais avez-vous essayé de voir si l'attribut Android:drawablePadding fait ce dont vous avez besoin ?

1 votes

Hm. J'ai fait un essai et cela ne semble pas avoir d'effet dans cette situation. Merci pour la suggestion, cela semble certainement correct d'après la description : "Le rembourrage entre les éléments dessinés et le texte".

4voto

Dilavar Points 281
final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),

    checkBox.getPaddingTop(),
    checkBox.getPaddingRight(),
    checkBox.getPaddingBottom());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X