Añadiendo imagen a Toast?

¿Es posible agregar una imagen a una ventana emergente de tostadas mediante programación?

, puede agregar vista de imagen o cualquier vista a la notificación de brindis usando el método setView (), utilizando este método puede personalizar el brindis según su requerimiento.

Aquí he creado un archivo de diseño personalizado para ser inflado en la notificación Toast y, a continuación, he utilizado este diseño en la notificación Toast utilizando el método 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(); 

Simplemente, utilice lo siguiente:

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

Puede crear cualquier vista de forma programática (ya que estoy asumiendo que usted está preguntando cómo hacer esto sin usar LayoutInflater) y llame a setView en el Toast que hizo.

  //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 solución de Knickedi es buena, pero si sólo necesita un icono junto al texto, puede utilizar el hecho de que el Toast tiene un TextView predefinido con el mismo ID y establecer el icono en 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)); 

Siempre existe la posibilidad de crear un diseño personalizado. Hubo un hecho que no me gustaba de eso: rompe la interfaz de usuario por defecto del sistema. Esto podría diferir en diferentes plataformas e implementaciones. No hay una manera simple de usar el recurso predeterminado del sistema, así que decidí cortar el brindis y forzar una imagen en él.

Sugerencia : Puede obtener el recurso predeterminado de la siguiente manera:
Toast.makeToast(context, "", 0).getView().getBackground()


Aquí hay un ayudante que mostrará una imagen delante del mensaje de brindis: Helper.makeImageToast(context, R.drawable.my_image, "Toast with image", Toast.LENGTH_SHORT).show()

Utilizo eso para indicar el éxito, la información o el error. Hace una información de brindis más agradable y más expresiva …

(Vale la pena mencionar que el hack basa en el hecho de que el tostado interno está utilizando un LinearLayout por lo que no es sistema e implementación independiente.

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

Creo que esto es mejor que mostramos el texto de Toast en la imagen que pasamos a la función makeImageToast … así que las sombras Knickedi códigos y:

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

}

Y esto es uso de ella:

 utility.makeImageToast(getApplicationContext(), R.drawable.your_image,"your_text",Toast.LENGTH_LONG).show(); 
  • Android Toast se mueve por la pantalla
  • El mensaje de Android Toast no se muestra
  • Cómo mostrar Toast en el centro de la pantalla
  • Cómo crear tostadas de IntentService? Se queda atascado en la pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.