Comment afficher le texte sur un ImageButton?

127

J'ai un ImageButtonet je veux montrer un texte et une image dessus. Mais quand j'essaye sur l'émulateur:

<ImageButton 
    android:text="OK" 
    android:id="@+id/buttonok" 
    android:src="@drawable/buttonok"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" />

J'obtiens l'image mais sans le texte. Comment puis-je afficher le texte? Aidez-moi, s'il vous plaît!

Võ Quang Hòa
la source

Réponses:

271

Comme vous ne pouvez pas utiliser, android:textje vous recommande d'utiliser un bouton normal et d'utiliser l'un des tirables composés. Par exemple:

<Button 
    android:id="@+id/buttonok" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/buttonok"
    android:text="OK"/>

Vous pouvez mettre le drawable où vous voulez en utilisant: drawableTop, drawableBottom, drawableLeftou drawableRight.

METTRE À JOUR

Pour un bouton, cela fonctionne aussi très bien. Mettre android:backgroundc'est bien!

<Button
    android:id="@+id/fragment_left_menu_login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/button_bg"
    android:text="@string/login_string" />

Je viens d'avoir ce problème et fonctionne parfaitement.

Cristian
la source
2
Cette option fonctionne mieux, à moins que vous n'ayez besoin d'une sorte de disposition de bouton folle, comme une image sablée par deux vues de texte. J'ai initialement essayé un objet de mise en page défini comme widget.button, puis y ai placé une imageview et une vue de texte, mais après avoir profilé cela, et la disposition Button ci-dessus, j'ai économisé près de 30% en temps de mesure, 50% en temps de mise en page et 15 -20% en temps de dessin sur mon FramLayout, et est passé de 38 objets à 26. C'est une économie assez substantielle.
Evan R.
3
@shim drawableTop placera le drawable en haut du bouton, drawableRight en bas, etc.
Cristian
1
@RenanBandeira oui, utilisez les setCompoundDrawables*()méthodes
Cristian
6
Comment puis-je mettre l'image à l'échelle pour l'adapter au bouton? Ou il ajusterait automatiquement l'image pour l'adapter au bouton.
Alston
3
Même question que @Stallman, comment ajuster l'image avec le bouton et la mettre à gauche?
Khuong
63

Il est techniquement possible de mettre une légende sur un ImageButtonsi vous voulez vraiment le faire. Il suffit de mettre un TextViewsur l' ImageButtonutilisation FrameLayout. N'oubliez pas de ne pas rendre le Textviewcliquable.

Exemple:

<FrameLayout>
    <ImageButton
        android:id="@+id/button_x"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@null"
        android:scaleType="fitXY"
        android:src="@drawable/button_graphic" >
    </ImageButton>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:clickable="false"
        android:text="TEST TEST" >
    </TextView>
</FrameLayout>
OncleIstvan
la source
Cela ne semble pas fonctionner sur Lollipop mais fonctionne parfaitement sur les autres.
Hong
2
Le problème avec cette approche est que le texte n'est pas affecté par l'état du bouton (désactivé, etc.) ... sauf si vous le faites manuellement.
TheOperator
9

Les gars, j'ai besoin de développer le bouton de réglage et de déconnexion, j'ai utilisé le code ci-dessous. entrez la description de l'image ici

    <Button
        android:id="@+id/imageViewLogout"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/size_30dp"
        android:layout_alignParentLeft="true"
        android:text="Settings"
        android:drawablePadding="10dp"
        android:background="@android:color/transparent"
        android:layout_alignParentBottom="true"
        android:drawableTop="@drawable/logout" />
Naveed Ahmad
la source
4

En fait, android:textn'est pas un argument accepté par ImageButton mais, Si vous essayez d'obtenir un bouton avec un arrière-plan spécifié (pas par défaut Android), utilisez l' android:backgroundattribut xml, ou déclarez-le à partir de la classe avec.setBackground();

Samuel
la source
4

Vous pouvez utiliser un LinearLayoutau lieu d'utiliser Buttonc'est un arrangement que j'ai utilisé dans mon application

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:background="@color/mainColor"
        android:orientation="horizontal"
        android:padding="10dp">

        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@drawable/ic_cv"
            android:textColor="@color/offBack"
            android:textSize="20dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:text="@string/cartyCv"
            android:textColor="@color/offBack"
            android:textSize="25dp" />

    </LinearLayout>
mxml
la source
Excellente solution! onClick fonctionne également parfaitement sur LinearLayout. Je ne vois pas pourquoi nous devrions utiliser un Button ou ImageButton
Sam
2

vous pouvez utiliser un Buttonattribut regular et android: drawableTop (ou left, right, bottom) à la place.

Nathan Schwermann
la source
2

Meilleur moyen:

<Button 
android:text="OK" 
android:id="@+id/buttonok" 
android:background="@drawable/buttonok"
android:layout_width="match_parent" 
android:layout_height="wrap_content"/>
eloytxo
la source
2
Cela ne semble pas être différent de ce que l'OP a essayé à l'origine.
PhonicUK
Désolé, je me trompe sur mon code. Ce n'était pas ImageButton, c'était juste Button.
eloytxo
2

J'ai résolu ce problème en mettant le ImageButtonet à l' TextViewintérieur d'un LinearLayoutavec une orientation verticale. Fonctionne très bien!

<LinearLayout
    android:id="@+id/linLayout"
    android:layout_width="80dp"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ImageButton
        android:id="@+id/camera_ibtn"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_gravity="center"
        android:background="@drawable/camera" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="@string/take_pic"
        android:textColor="#FFFFFF"
        android:textStyle="bold" />

</LinearLayout>
Rafael Dvl
la source
1

Voici un bel exemple de cercle:

drawable/circle.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid
        android:color="#ff87cefa"/>

    <size
        android:width="60dp"
        android:height="60dp"/>
</shape>

Et puis le bouton dans votre fichier xml:

<Button
    android:id="@+id/btn_send"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:background="@drawable/circle"
    android:text="OK"/>
K - La toxicité du SO augmente.
la source
0

ImageButtonne peut pas avoir text(ou, du moins, android:textn'est pas répertorié dans ses attributs).

Le truc c'est:

Il semble que vous deviez utiliser Button(et regarder drawableTopou setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)).

Ajay Venugopal
la source