Est-il possible d'ajouter par programme une image à une grille de pain grillé?
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();
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();
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();
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));
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;
}
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();
Toast aa = Toast.makeText(getBaseContext(), "OPEN",Toast.LENGTH_SHORT);
ImageView cc = new ImageView(getBaseContext());
cc.setImageResource(R.drawable.a);
aa.setView(cc);
aa.show();