Existe-t-il un moyen simple d'ajouter un remplissage entre la case à cocher d'un contrôle CheckBox et le texte associé?
Je ne peux pas simplement ajouter des espaces de début, car mon étiquette est multiligne.
En l'état, le texte est beaucoup trop proche de la case à cocher:
TextView
avecdrawableLeft
et utiliserdrawablePadding
pour donner de l'espace au texte. Dans le code, basculez simplement les états sélectionnés et non sélectionnés.Réponses:
Je déteste répondre à ma propre question, mais dans ce cas, je pense que je dois le faire. Après l'avoir vérifié, @Falmarri était sur la bonne voie avec sa réponse. Le problème est que le contrôle CheckBox d'Android utilise déjà la propriété android: paddingLeft pour obtenir le texte où il se trouve.
La ligne rouge montre la valeur de décalage paddingLeft de l'ensemble du CheckBox
Si je remplace simplement ce remplissage dans ma disposition XML, cela gâche la disposition. Voici ce que fait la définition de paddingLeft = "0":
Il s'avère que vous ne pouvez pas résoudre ce problème en XML. Vous devez le faire en code. Voici mon extrait de code avec une augmentation de remplissage codée en dur de 10dp.
Cela vous donne ce qui suit, où la ligne verte est l'augmentation du rembourrage. C'est plus sûr que de coder en dur une valeur, car différents appareils peuvent utiliser différents drawables pour la case à cocher.
MISE À JOUR - Comme les gens l'ont récemment mentionné dans les réponses ci-dessous, ce comportement a apparemment changé dans Jelly Bean (4.2). Votre application devra vérifier sur quelle version elle s'exécute et utiliser la méthode appropriée.
Pour 4.3+, il suffit de définir padding_left. Voir la réponse de htafoya pour plus de détails.
la source
paddingLeft="48sp"
? Fonctionne bien ici, même si je change d'échelle et d'orientation. Votre code m'a donné des valeurs de remplissage erratiques sur une liste d'éléments.getView()
un adaptateur personnalisé (si vous recyclez vos vues), car le rembourrage augmentera sans cesse. Pour résoudre ce problème , je devais utiliser quelque chose comme ceci:boolean isHackNeeded = Build.VERSION.SDK_INT < 17; float scale = context.getResources().getDisplayMetrics().density; if (isHackNeeded) {CheckBox rb = new CheckBox(context); this.PADDING = rb.getPaddingLeft() + Math.round(10.0f * scale); } else { this.PADDING = Math.round(10.0f * scale); }
. Et puis utiliserPADDING
pour chaque CheckBox que je gonfle:check.setPadding(PADDING, check.getPaddingTop() ...
Étant donné la réponse de @DougW, ce que je fais pour gérer la version est plus simple, j'ajoute à ma vue case à cocher:
où le dimen se trouve dans deux dossiers de valeurs:
valeurs
values-v17 (4.2 JellyBean)
J'ai une vérification personnalisée, utilisez le dps à votre meilleur choix.
la source
values-v17
car le correctif a été introduit dans l'API 17 (selon certains articles ci-dessus)Utilisez l'attribut
android:drawableLeft
au lieu deandroid:button
. Afin de définir le remplissage entre l'utilisation du dessin et du texteandroid:drawablePadding
. Pour positionner l'utilisation à tirerandroid:paddingLeft
.la source
android:background="@android:color/transparent"
et la marge gauche disparaîtront<item name="android:checkboxStyle">@style/CheckBox</item>
cette façon, vous avez défini le style une seule fois et référencé une seule fois.Android 4.2 Jelly Bean (API 17) met le texte paddingLeft à partir du buttonDrawable (entre le bord droit). Il fonctionne également pour le mode RTL.
Avant 4.2 paddingLeft ignorait le buttonDrawable - il était pris du bord gauche de la vue CompoundButton.
Vous pouvez le résoudre via XML - définissez paddingLeft sur buttonDrawable.width + requiredSpace sur les androïdes plus anciens. Définissez-le sur requiredSpace uniquement sur l'API 17. Par exemple, utilisez les ressources de dimension et remplacez-les dans le dossier de ressources values-v17.
Le changement a été introduit via android.widget.CompoundButton.getCompoundPaddingLeft ();
la source
android:background="@android:color/transparent"
.Oui, vous pouvez ajouter du rembourrage en ajoutant du rembourrage.
android:padding=5dp
la source
Si vous voulez un design épuré sans codes, utilisez:
L'astuce consiste à définir la couleur sur transparent pour
android:drawableLeft
et à attribuer une valeur àandroid:drawablePadding
. De plus, la transparence vous permet d'utiliser cette technique sur n'importe quelle couleur d'arrière-plan sans effet secondaire, comme une différence de couleur.la source
API 17 et supérieur, vous pouvez utiliser:
API 16 et inférieures, vous pouvez utiliser:
la source
Dans mon cas, j'ai résolu ce problème en utilisant cet attribut CheckBox suivant dans le XML:
*
*
la source
Solution simple, ajoutez cette ligne dans les propriétés CheckBox , remplacez 10dp par la valeur d'espacement souhaitée
la source
Je ne connais pas les gars, mais j'ai testé
<CheckBox android:paddingLeft="8mm"
et déplace uniquement le texte vers la droite, pas le contrôle entier.Ça me va bien.
la source
Pourquoi ne pas simplement étendre l'Android CheckBox pour avoir un meilleur rembourrage à la place. De cette façon, au lieu d'avoir à le corriger dans le code chaque fois que vous utilisez le CheckBox, vous pouvez simplement utiliser le CheckBox fixe à la place.
Première extension de CheckBox:
Deuxième dans votre xml au lieu de créer une CheckBox normale, créez votre extension
la source
Je viens de conclure à ce sujet:
Remplacez CheckBox et ajoutez cette méthode si vous avez un dessinable personnalisé:
ou ceci si vous utilisez le système drawable:
Merci d'avoir répondu :)
la source
Ce comportement semble avoir changé dans Jelly Bean. L'astuce paddingLeft ajoute un remplissage supplémentaire, ce qui rend le texte trop à droite. Quelqu'un d'autre l'a remarqué?
la source
Pour l'espace entre la coche et le texte, utilisez:
Mais cela devient plus de 10dp, car la coche contient un remplissage (environ 5dp) autour. Si vous souhaitez supprimer le remplissage, consultez Comment supprimer le remplissage autour d'Android CheckBox :
la source
la source
Bad idea for usability
Non ce n'est pas. Placez la case à cocher et la vue de texte dans une disposition linéaire et rendez cette disposition linéaire tactile.Si vous avez un sélecteur d'image personnalisé pour la case à cocher ou le bouton radio, vous devez définir le même bouton et la même propriété d'arrière-plan, comme ceci:
Vous pouvez contrôler la taille de la case à cocher ou du remplissage des boutons radio avec la propriété background.
la source
seulement vous devez avoir un paramètre dans le fichier xml
la source
Définir minHeight et minWidth
0dp
était la solution la plus propre et la plus directe pour moi sur Android 9 API 28:la source
Si vous créez des boutons personnalisés, par exemple, voir changer l'apparence du didacticiel de case à cocher
Augmentez ensuite simplement la largeur de btn_check_label_background.9.png en ajoutant une ou deux colonnes supplémentaires de pixels transparents au centre de l'image; laissez les marqueurs à 9 patchs tels quels.
la source
Ce que j'ai fait, c'est d'avoir un
TextView
et un à l'CheckBox
intérieur d'un (Relatif)Layout
. LeTextView
affiche le texte que je veux que l'utilisateur voie et leCheckBox
n'a pas de texte. De cette façon, je peux définir la position / le rembourrage de l'CheckBox
endroit où je veux.la source
J'ai eu le même problème avec un Galaxy S3 mini (Android 4.1.2) et j'ai simplement étendu ma case à cocher personnalisée pour étendre AppCompatCheckBox au lieu de CheckBox. Maintenant ça marche parfaitement.
la source
Vous devez obtenir la taille de l'image que vous utilisez afin d'ajouter votre rembourrage à cette taille. Sur les internes Android, ils obtiennent le dessin que vous spécifiez sur src et utilisent ensuite sa taille. Puisqu'il s'agit d'une variable privée et qu'il n'y a pas de getters, vous ne pouvez pas y accéder. Vous ne pouvez pas non plus obtenir le com.android.internal.R.styleable.CompoundButton et obtenir le dessinable à partir de là.
Vous devez donc créer votre propre styleable (c'est-à-dire custom_src) ou vous pouvez l'ajouter directement dans votre implémentation du RadioButton:
la source
Comme vous utilisez probablement un sélecteur de dessin pour votre
android:button
propriété, vous devez ajouterandroid:constantSize="true"
et / ou spécifier un dessin par défaut comme celui-ci:Après cela, vous devez spécifier l'
android:paddingLeft
attribut dans votre case à cocher xml.Les inconvénients:
Dans l'éditeur de mise en page, le texte passe sous la case à cocher avec api 16 et ci-dessous, dans ce cas, vous pouvez le corriger en créant votre classe de case à cocher personnalisée comme suggéré, mais pour le niveau api 16.
Raisonnement:
c'est un bogue car l'
StateListDrawable#getIntrinsicWidth()
appel est utilisé en interneCompoundButton
mais il peut retourner une< 0
valeur s'il n'y a pas d'état actuel et qu'aucune taille constante n'est utilisée.la source
Tout ce que vous avez à faire pour surmonter ce problème est d'ajouter
android:singleLine="true"
à la misecheckBox
en page XML de votre Android:et rien de spécial ne sera ajouté par programme.
la source
L'image de la case à cocher se chevauchait lorsque j'ai utilisé mes propres tirables du sélecteur, j'ai résolu cela en utilisant le code ci-dessous:
Merci à Alex Semeniuk
la source
Je me retrouve avec ce problème en changeant les images. Ajout d'un fond transparent supplémentaire dans les fichiers png. Cette solution fonctionne parfaitement sur toutes les API.
la source
C'est peut-être trop tard, mais j'ai créé des méthodes utilitaires pour gérer ce problème.
Ajoutez simplement ces méthodes à vos utilitaires:
Et utilisez comme ceci:
ou comme ça:
la source
Au lieu d'ajuster le texte de Checkbox, j'ai fait la chose suivante et cela a fonctionné pour moi pour tous les appareils. 1) En XML, ajoutez une case à cocher et une vue de texte adjacentes les unes aux autres; garder une certaine distance. 2) Définissez la taille du texte de la case à cocher sur 0sp. 3) Ajoutez du texte relatif à cette vue de texte à côté de la case à cocher.
la source
<CheckBox android:drawablePadding="16dip"
- Le rembourrage entre les tirables et le texte.la source