62 votes

Ajouter une image à Toast ?

Est-il possible d'ajouter par programme une image à un toast popup ?

5 votes

1 votes

@SpK +1 pour cette bonne question

86voto

Paresh Mayani Points 48123

Oui Vous pouvez ajouter une image ou n'importe quelle vue dans la notification de toast en utilisant la méthode setView(), en utilisant cette méthode vous pouvez personnaliser le Toast selon vos besoins.

Ici, j'ai créé un fichier de mise en page personnalisé à gonfler dans la notification Toast, puis j'ai utilisé cette mise en page dans la notification Toast en utilisant la méthode setView().

cust_toast_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/relativeLayout1"
  android:background="@android:color/white">

    <TextView
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/textView1" android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:text="PM is here"
        android:gravity="center"
        android:textColor="@android:color/black">
    </TextView>

    <ImageView
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:src="@drawable/new_logo"
        android:layout_below="@+id/textView1"
        android:layout_margin="5dip"
        android:id="@+id/imageView1">
    </ImageView>

    <TextView
        android:id="@+id/textView2"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:text="This is the demo of Custom Toast Notification"
        android:gravity="center"
        android:layout_below="@+id/imageView1"
        android:textColor="@android:color/black">
    </TextView>

</RelativeLayout>

CustomToastDemoActivity.java (en anglais)

LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.cust_toast_layout, 
    (ViewGroup)findViewById(R.id.relativeLayout1));

Toast toast = new Toast(this);
toast.setView(view);
toast.show();

0 votes

@Blundell Aquí est le tutoriel détaillé avec les résultats instantanés.

25voto

Tamawy Points 1447

Utilisez simplement les éléments suivants :

Toast toast = new Toast(myContext);
ImageView view = new ImageView(myContext); 
view.setImageResource(R.drawable.image_icon); 
toast.setView(view); 
toast.show();

14voto

Justin Breitfeller Points 6375

Vous pouvez créer n'importe quelle vue de manière programmatique (puisque je suppose que vous demandez comment faire SANS utiliser un LayoutInflater) et appeler setView sur le Toast que vous avez créé.

    //Create a view here
    LinearLayout v = new LinearLayout(this);
    //populate layout with your image and text or whatever you want to put in here

    Toast toast = new Toast(getApplicationContext());
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
    toast.setDuration(Toast.LENGTH_LONG);
    toast.setView(v);
    toast.show();

14voto

robUx4 Points 161

La solution de Knickedi est bonne, mais si vous avez seulement besoin d'une icône à côté du texte, vous pouvez utiliser le fait que le Toast a un TextView prédéfini avec le même ID et définir l'icône sur le TextView :

Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
TextView tv = (TextView) toast.getView().findViewById(android.R.id.message);
if (null!=tv) {
    tv.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
    tv.setCompoundDrawablePadding(context.getResources().getDimensionPixelSize(R.dimen.padding_toast));

1voto

Knickedi Points 5881

Il est toujours possible de créer une mise en page personnalisée. Il y a un fait qui m'a déplu : Cela casse l'interface utilisateur par défaut du système de toast. Cela peut varier selon les plateformes et les implémentations. Il n'y a pas de moyen simple d'utiliser la ressource par défaut du système, j'ai donc décidé de pirater le toast et d'y forcer une image.

Indice : Vous pouvez obtenir la ressource par défaut comme ceci :
Toast.makeToast(context, "", 0).getView().getBackground()


Voici une aide qui affichera une image devant le message du toast : Helper.makeImageToast(context, R.drawable.my_image, "Toast with image", Toast.LENGTH_SHORT).show()

Je l'utilise pour indiquer un succès, une info ou une erreur. Cela rend une information de toast plus jolie et plus expressive...

(Il est utile de mentionner que le hack se base sur le fait que le toast interne utilise un LinearLayout n'est donc pas indépendant du système et de la mise en œuvre. Voir les commentaires).

public static Toast makeImageToast(Context context, int imageResId, CharSequence text, int length) {
    Toast toast = Toast.makeText(context, text, length);

    View rootView = toast.getView();
    LinearLayout linearLayout = null;
    View messageTextView = null;

    // check (expected) toast layout
    if (rootView instanceof LinearLayout) {
        linearLayout = (LinearLayout) rootView;

        if (linearLayout.getChildCount() == 1) {
            View child = linearLayout.getChildAt(0);

            if (child instanceof TextView) {
                messageTextView = (TextView) child;
            }
        }
    }

    // cancel modification because toast layout is not what we expected
    if (linearLayout == null || messageTextView == null) {
        return toast;
    }

    ViewGroup.LayoutParams textParams = messageTextView.getLayoutParams();
    ((LinearLayout.LayoutParams) textParams).gravity = Gravity.CENTER_VERTICAL;

    // convert dip dimension
    float density = context.getResources().getDisplayMetrics().density;
    int imageSize = (int) (density * 25 + 0.5f);
    int imageMargin = (int) (density * 15 + 0.5f);

    // setup image view layout parameters
    LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(imageSize, imageSize);
    imageParams.setMargins(0, 0, imageMargin, 0);
    imageParams.gravity = Gravity.CENTER_VERTICAL;

    // setup image view
    ImageView imageView = new ImageView(context);
    imageView.setImageResource(imageResId);
    imageView.setLayoutParams(imageParams);

    // modify root layout
    linearLayout.setOrientation(LinearLayout.HORIZONTAL);
    linearLayout.addView(imageView, 0);

    return toast;
}

0 votes

Cela ne fonctionne que si la disposition du Toast est de type LinearLayout . Il n'y a aucun contact afaik que le Toast aura toujours un LinearLayout. Votre code s'occupe de cela en n'ajoutant pas l'image mais il est bon de noter que cette solution n'est pas indépendante du périphérique / de la version.

0 votes

@Graeme Vous avez raison. Merci pour l'astuce. La meilleure solution serait de recréer le toast dans un LinearLayout propre. Je mettrai à jour ma réponse lorsque j'aurai trouvé le temps de le faire.

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