Est-il possible d'ajouter par programme une image à un toast popup ?
@Blundell Aquí est le tutoriel détaillé avec les résultats instantanés.
Est-il possible d'ajouter par programme une image à un toast popup ?
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();
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();
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));
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;
}
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.
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.
5 votes
Essayez de voir ici
1 votes
@SpK +1 pour cette bonne question