web-dev-qa-db-fra.com

Ajouter une image à Toast?

Est-il possible d'ajouter par programme une image à une grille de pain grillé?

56
Praveenkumar

Oui , vous pouvez ajouter une vue image ou n’importe quelle vue dans la notification de pain grillé à l’aide de la méthode setView (). Cette méthode permet de personnaliser le pain grillé en fonction de vos besoins.

Ici, j'ai créé un fichier de présentation personnalisé à gonfler dans la notification Toast, puis j'ai utilisé cette présentation dans la notification Toast à l'aide de 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

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();
81
Paresh Mayani

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();
21
Sami Eltamawy

Vous pouvez créer n'importe quelle vue par programme (puisque je suppose que vous demandez comment le 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();
14
Justin Breitfeller

La solution de Knickedi est bonne, mais si vous n'avez besoin que 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éfinissez 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));
10
robUx4

Il y a toujours la possibilité de créer une mise en page personnalisée. Il y avait un fait que je n'aimais pas à ce sujet: cela casse l'interface utilisateur de toast par défaut du système. Cela peut différer sur différentes plates-formes et implémentations. Il n'y a pas de moyen simple d'utiliser la ressource système par défaut, j'ai donc décidé de pirater le pain grillé et d'y forcer une image.

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


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

J'utilise cela pour indiquer le succès, l'information ou l'erreur. Rend les informations plus agréables et plus expressives ...

(Il est intéressant de noter que le hack repose sur le fait que la grille interne utilise un LinearLayout et que le système et son implémentation ne sont donc pas indépendants. 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;
}
1
Knickedi

Je pense que c’est mieux que nous montrions le texte de Toast sur l’image que nous passons à la fonction makeImageToast ...

public class utility  {

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;
                ((TextView) child).setGravity(Gravity.CENTER);

            }
        }
    }

    // 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;

    // 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;

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


    // modify root layout
    linearLayout.setOrientation(LinearLayout.HORIZONTAL);
    linearLayout.setBackgroundResource(imageResId);
    linearLayout.setGravity(Gravity.CENTER);
    linearLayout.setHorizontalGravity(Gravity.CENTER);
    linearLayout.setHorizontalGravity(Gravity.CENTER);
    //addView(imageView, 0);

    return toast;
}

et c'est l'usage de celui-ci:

utility.makeImageToast(getApplicationContext(),
                 R.drawable.your_image,"your_text",Toast.LENGTH_LONG).show();
1
H.sojoodi
Toast aa = Toast.makeText(getBaseContext(), "OPEN",Toast.LENGTH_SHORT);
ImageView cc = new ImageView(getBaseContext());
cc.setImageResource(R.drawable.a);
aa.setView(cc);
aa.show();
0
Mohamed Zarara