569 votes

Android : combiner texte et image sur un bouton ou un ImageButton

J'essaie d'avoir une image (comme arrière-plan) sur un bouton et d'ajouter dynamiquement, en fonction de ce qui se passe pendant l'exécution, du texte au-dessus de l'image.

Si j'utilise ImageButton Je n'ai même pas la possibilité d'ajouter du texte. Si j'utilise Button Je peux ajouter du texte mais seulement définir une image avec android:drawableBottom et des attributs XML similaires tels que définis ici .

Cependant, ces attributs ne combinent le texte et l'image que dans les dimensions x et y, ce qui signifie que je peux dessiner une image autour de mon texte, mais pas sous mon texte (l'axe z étant défini comme sortant de l'affichage).

Avez-vous des suggestions sur la manière de procéder ? Une idée serait d'étendre Button ou ImageButton et remplacer le draw() -de la méthode. Mais avec mon niveau actuel de connaissances, je ne sais pas vraiment comment faire (rendu 2D). Peut-être que quelqu'un ayant plus d'expérience connaît une solution ou au moins quelques pistes pour commencer ?

1 votes

utiliser 9Patch, une solution intelligente

1 votes

salut @Charu s'il vous plaît vérifiez ceci si vous pouvez stackoverflow.com/questions/42968587/

1 votes

Le meilleur moyen est d'utiliser CardView >> Il suffit de mettre LinearLayout à l'intérieur de CardView ensemble image comme un fond de LinearLayout et utiliser textView à l'intérieur dans ce LinearLayout . Pour plus de détails Regardez ça > stackoverflow.com/a/65172123/12750160 . Merci, bon codage :)

629voto

OneWorld Points 6140

Pour les utilisateurs qui souhaitent simplement placer l'arrière-plan, l'image-icône et le texte en un seul endroit. Button à partir de différents fichiers : Définir sur un Button background, drawableTop/Bottom/Rigth/Left et rembourrage attributs.

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/home_btn_test"
        android:drawableTop="@drawable/home_icon_test"
        android:textColor="#FFFFFF"
        android:id="@+id/ButtonTest"
        android:paddingTop="32sp"
        android:drawablePadding="-15sp"
        android:text="this is text"></Button>

Pour un arrangement plus sophistiqué, vous pouvez également utiliser RelativeLayout (ou toute autre mise en page) et le rendre cliquable.

Tutoriel : Excellent tutoriel qui couvre les deux cas : http://izvornikod.com/Blog/tabid/82/EntryId/8/Creating-Android-button-with-image-and-text-using-relative-layout.aspx

73 votes

Pour faire cela de manière programmatique, utilisez b.setCompoundDrawablesWithIntrinsicBound(null,R.drawable.hom‌​e_icon_test,null,nul‌​l) au lieu de android:drawableTop et b.setPadding(0,32,0,0) au lieu de android:paddingTop .

4 votes

L'utilisation d'une mise en page comme bouton est en fait une approche assez souple.

4 votes

Remplacez simplement null par 0 si vous utilisez des identifiants de ressources pour vos objets à dessiner.

356voto

schlingel Points 4469

Il y a une bien meilleure solution pour ce problème.

Prenez juste une normale Button et utiliser le drawableLeft et le gravity attributs.

<Button
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:drawableLeft="@drawable/my_btn_icon"
  android:gravity="left|center_vertical" />

De cette façon, vous obtenez un bouton qui affiche une icône sur le côté gauche du bouton et le texte sur le côté droit de l'icône. vertical centré .

3 votes

Un problème se pose avec cette solution si vous avez choisi d'avoir une couleur de fond sur le bouton (ce qui est probable dans ce cas). Il n'y aura alors aucune réponse graphique au clic ou à la sélection. Vous pouvez écrire un sélecteur pour gérer cela, mais vous n'obtiendrez pas les couleurs par défaut des téléphones.

11 votes

Je voulais juste ajouter que Rembourrage amovible est très utile si cette solution est utilisée.

6 votes

Existe-t-il un moyen de définir la hauteur et la largeur des icônes à dessiner en XML ?

210voto

Vitaly Polonetsky Points 5264

Vous pouvez appeler setBackground() sur un Button pour définir l'arrière-plan du bouton.

Tout texte apparaîtra au-dessus de l'arrière-plan.

Si vous cherchez quelque chose de similaire en xml, il existe : android:background qui fonctionne de la même manière.

50 votes

Si vous suivez cette voie, vous ne voulez pas utiliser un simple drawable pour l'arrière-plan. Utilisez un StateListDrawable (généralement via le fichier XML <selector> dans res/drawable/), afin de pouvoir définir des arrière-plans pour les différents états (normal, appuyé, focalisé, désactivé, etc.).

1 votes

D'accord avec vous, cherchez cette question et ma réponse : stackoverflow.com/questions/1533038/

2 votes

C'est stupide. Comment ai-je pu manquer ça dans la documentation ? Merci pour la réponse rapide et aussi pour l'astuce avec le <sélector>. C'est quelque chose que je veux absolument mettre en œuvre à l'avenir.

61voto

Kieran Points 282

Il suffit d'utiliser un LinearLayout et de prétendre qu'il s'agit d'une Button - réglage background et cliquable est la clé :

<LinearLayout
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:drawable/btn_default"
    android:clickable="true"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="5dp"
        android:src="@drawable/image" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="5dp"
        android:text="Do stuff" />
</LinearLayout>

1 votes

Comment ajouter l'effet cliqué ?

3 votes

Meilleure réponse, de cette façon vous gérez 100% de l'apparence et vous n'avez pas besoin de coller l'icône à une bordure.

0 votes

franche, ajouter android:onClick à votre vue

45voto

kira Points 1012

remplacez simplement

android:background="@drawable/icon"

avec

android:background="@android:color/transparent"
android:drawableTop="@drawable/[your background image here]"

C'est un bon truc ;)

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