Je veux avoir un bouton Android avec l'icône + le texte centré à l'intérieur. J'utilise l'attribut drawableLeft pour définir l'image, cela fonctionne bien si le bouton a une largeur de "wrap_content"
mais j'ai besoin de l'étirer à la largeur maximale, donc j'utilise la largeur "fill_parent"
. Cela déplace mon icône directement à gauche du bouton et je veux que l'icône et le texte soient centrés à l'intérieur du bouton.
J'ai essayé de configurer le rembourrage mais cela ne permet que de donner une valeur fixe, donc ce n'est pas ce dont j'ai besoin. J'ai besoin d'aligner l'icône + le texte au centre.
<Button
android:id="@+id/startTelemoteButton"
android:text="@string/start_telemote"
android:drawableLeft="@drawable/start"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:width="fill_parent"
android:heigh="wrap_content" />
Des suggestions sur la façon dont je pourrais y parvenir?
android
android-layout
user-interface
button
alignment
jloriente
la source
la source
Réponses:
android: drawableLeft garde toujours android: paddingLeft comme distance de la bordure gauche. Lorsque le bouton n'est pas défini sur android: width = "wrap_content", il sera toujours suspendu à gauche!
Avec Android 4.0 (niveau d'API 14), vous pouvez utiliser l' attribut android: drawableStart pour placer un dessinable au début du texte. La seule solution rétrocompatible que j'ai proposée consiste à utiliser un ImageSpan pour créer un texte + image spannable:
Dans mon cas, j'avais également besoin d'ajuster l'attribut android: gravity du Button pour le faire paraître centré:
la source
button.setText(buttonLabel)
Je sais que je suis en retard pour répondre à cette question, mais cela m'a aidé:
J'ai trouvé cette solution à partir d'ici: les difficultés de l'interface utilisateur Android: créer un bouton avec un texte et une icône centrés
la source
J'ai utilisé LinearLayout au lieu de Button . Le OnClickListener , que je dois utiliser fonctionne très bien aussi pour LinearLayout.
la source
Toutes les réponses précédentes semblent obsolètes
Vous pouvez utiliser le
MaterialButton
maintenant qui permet de régler la gravité de l'icône.Pour utiliser les composants matériels, vous devrez évidemment:
Ajouter une dépendance
implementation 'com.google.android.material:material:1.3.0-alpha01'
(utiliser la dernière version)Faites étendre votre thème au thème Composants matériels
Si vous ne pouvez pas le faire, étendez-le à partir du thème Material Bridge
la source
Je l'ajuste en ajoutant un rembourrage à gauche et à droite comme suit:
la source
J'ai récemment rencontré le même problème. J'ai essayé de trouver une solution moins chère, alors j'ai trouvé ça.
Alors appelle juste
OnClickListener
leLinearLayout
.J'espère que cela aide quelqu'un car cela semble être un problème très courant. :)
la source
Vous pouvez utiliser un bouton personnalisé qui mesure et se dessine pour accueillir un dessin de gauche. Veuillez trouver un exemple et une utilisation ici
Usage
la source
C'est ma solution que j'ai écrite il y a 3 ans. Le bouton a du texte et une icône de gauche et est dans le cadre qui est le bouton réel ici et peut être étiré par fill_parent. Je ne peux pas le tester à nouveau, mais cela fonctionnait à l'époque. Button n'a probablement pas besoin d'être utilisé et peut être remplacé par TextView mais je ne le testerai pas pour le moment et cela ne change pas trop la fonctionnalité ici.
la source
Je sais que cette question est un peu plus ancienne, mais peut-être que vous êtes toujours ouvert pour des conseils ou des solutions de contournement:
Créez un RelativeLayout "wrap_content" avec l'image du bouton comme arrière-plan ou le bouton lui-même comme premier élément de la mise en page. Obtenez un LinearLayout et définissez-le sur "layout_centerInParent" et "wrap_content". Ensuite, définissez votre Drawable comme Imageview. Enfin, définissez un TextView avec votre texte (paramètres régionaux).
donc fondamentalement vous avez cette structure:
ou comme ça:
Je sais qu'avec cette solution, il y a de nombreux éléments à traiter, mais vous pouvez créer très facilement votre propre bouton personnalisé avec elle et également définir la position exacte du texte et des dessinables :)
la source
Ma façon de résoudre ce problème consistait à entourer le bouton d'
<View ../>
éléments légers qui se redimensionnent dynamiquement. Voici quelques exemples de ce qui peut être réalisé avec ceci:Notez que la zone cliquable des boutons dans l'exemple 3 est la même que dans 2 (c'est-à-dire avec des espaces), ce qui est différent de l'exemple 4 où il n'y a pas d'espaces "non cliquables" entre les deux.
Code:
la source
Essayez d'utiliser cette bibliothèque
OmegaCenterIconButton
la source
Vous pouvez créer un widget personnalisé:
La classe Java IButton:
}
La mise en page ibutton.xml
Pour utiliser ce widget personnalisé:
Vous devez fournir l'espace de noms pour les attributs personnalisés xmlns: ibutton = "http://schemas.android.com/apk/res/com.test.android.xxx" où com.test.android.xxx est le package racine de L'application.
Mettez-le simplement sous xmlns: android = "http://schemas.android.com/apk/res/android".
La dernière chose dont vous aurez besoin sont les attributs personnalisés dans le fichier attrs.xml.
Dans le fichier attrs.xml
Pour un meilleur positionnement, enveloppez le Button personnalisé dans un LinearLayout, si vous souhaitez éviter des problèmes potentiels avec les positionnements RelativeLayout.
Prendre plaisir!
la source
J'ai eu un problème similaire mais je voulais avoir un dessin au centre sans texte et sans mise en page enveloppée. La solution était de créer un bouton personnalisé et d'ajouter un autre dessinable en plus de GAUCHE, DROITE, HAUT, BAS. On peut facilement modifier le placement dessiné et l'avoir dans la position souhaitée par rapport au texte.
CenterDrawableButton.java
attrs.xml
usage
la source
Placez le FrameLayout dans LinearLayout et définissez l'orientation sur Horizontal.
la source
Vous pouvez placer le bouton sur un LinearLayout
la source
Que se passe-t-il si vous essayez android: gravity = "center_horizontal"?
la source
Je pense que Android: gravity = "center" devrait fonctionner
la source
Comme suggéré par Rodja, avant la version 4.0, il n'y avait pas de moyen direct de centrer le texte avec le dessinable. Et en effet, la définition d'une valeur padding_left éloigne le dessinable de la bordure. Par conséquent, ma suggestion est que lors de l'exécution, vous calculez exactement combien de pixels de la bordure gauche votre dessinable doit être, puis passez-le en utilisant setPadding Votre calcul peut être quelque chose comme
La largeur de votre dessin est fixe et vous pouvez la rechercher et vous pouvez également calculer ou deviner la largeur du texte.
Enfin, vous devez multiplier la valeur de remplissage par la densité de l'écran, ce que vous pouvez faire à l'aide de DisplayMetrics
la source
Je ne le teste pas mais il semble que vous puissiez utiliser la bibliothèque CenteredContentButton
la source
public class DrawableCenterTextView étend TextView {
}
la source
Correctif sale.
Trouver le bon rembourrage résout le but. Cependant, pour un écran varié, utilisez un remplissage différent et placez-le dans la ressource dimens dans le dossier de valeurs respectif.
la source
Utilisez RelativeLayout (conteneur) et android: layout_centerHorizontal = "true" , mon exemple:
la source
Autre possibilité de conserver le thème Button.
Avec cette solution, si vous ajoutez @ color / your_color @ color / your_highlight_color dans votre thème d'activité, vous pouvez avoir le thème Matherial sur Lollipop avec ombre et ondulation, et pour la version précédente, bouton plat avec votre couleur et votre couleur de surbrillance lorsque vous appuyez dessus.
De plus, avec cette solution, la redimensionnement automatique de l'image
Résultat: Premier sur l'appareil Lollipop Deuxième: Sur l'appareil pré-sucette 3ème: Appuyez sur le bouton de l'appareil Pré-sucette
la source
J'ai centré
textView
avec l'icône en utilisantpaddingLeft
et et en alignant textView à gauche | centerVertical . et pour un petit écart entre la vue et l'icône, j'ai utilisédrawablePadding
la source
android:paddingLeft
fonctionné.Cela peut être un fil ancien / fermé, mais j'ai cherché partout, je n'ai pas trouvé quelque chose d'utile, jusqu'à ce que je décide de créer ma propre solution. S'il y a quelqu'un ici qui essaie de chercher une réponse, essayez celle-ci, cela pourrait vous faire gagner une minute de réflexion
Étant donné que la mise en page linéaire agit comme le conteneur et celui qui a le sélecteur, lorsque vous cliquez sur la mise en page linéaire entière, elle ressemblerait à ce qu'elle devrait être. si vous voulez qu'il soit à la fois centré, utilisez l'insteaf relative. Si vous voulez qu'il soit centré horizontalement, changez l'orientation en horizontal.
Prenez note N'OUBLIEZ PAS d'ajouter android: clickable = "true" à votre conteneur principal (relatif ou linéaire) pour que l'action se déroule.
Encore une fois, cela peut être un vieux fil mais peut encore aider quelqu'un là-bas.
-cheers espère que cela aide- happycodings.
la source
Si vous utilisez l'une des solutions de vue personnalisée , soyez prudent, car elles échouent souvent sur du texte long ou multiligne . J'ai réécrit quelques réponses, remplacé
onDraw()
et compris que c'était une mauvaise façon.la source
J'ai vu des solutions pour aligner drawable au début / gauche mais rien pour drawable end / right, alors j'ai trouvé cette solution. Il utilise des rembourrages calculés dynamiquement pour aligner le dessin et le texte sur les côtés gauche et droit.
Il est important de définir la gravité dans votre mise en page sur "center_vertical | start" ou "center_vertical | end" selon l'endroit où vous définissez l'icône. Par exemple:
Le seul problème avec cette implémentation est que le bouton ne peut avoir qu'une seule ligne de texte, sinon la zone du texte remplit le bouton et les remplissages seront de 0.
la source
utilisez ceci
android:background="@drawable/ic_play_arrow_black_24dp"
il suffit de définir l'arrière-plan sur l'icône que vous souhaitez centrer
la source