2011-09-27 21 views
54

¿Es posible agregar una imagen programáticamente a una ventana emergente de brindis?¿Agregar una imagen a Toast?

+5

[Trate de ver aquí] (http://developer.android.com/ guía/temas/ui/notifiers/brindis.html # CustomToastView) – crbin1

+1

@SpK +1 para una buena pregunta – swiftBoy

Respuesta

80

, puede agregar imageview o cualquier vista en la notificación tostadas utilizando el método setView(), el uso de este método se puede personalizar la tostada como por su exigencia.

Aquí he creado un archivo de diseño personalizado para ser inflado en la notificación de Toast, y luego he utilizado este diseño en la notificación de 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(); 
+0

@Blundell [** Aquí **] (http://www.technotalkative.com/android-custom-toast- notification /) es el tutorial detallado con el complemento de salida. –

+0

@PareshMayani: :)))) .. Gran respuesta Bhai .. !!! –

+0

@HareshChaudhary Gracias :) –

14

Puede crear cualquier vista mediante programación (ya que supongo que está preguntando cómo hacerlo SIN usar un LayoutInflater) y llama 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(); 
1

Siempre existe la posibilidad de crear un diseño personalizado. Hubo un hecho que no me gustaba de eso: rompe la interfaz de usuario tostada predeterminada 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í hackear el brindis y forzar una imagen en él.

Indirecta: Usted puede obtener el recurso predeterminado de esta manera:
Toast.makeToast(context, "", 0).getView().getBackground()


Aquí está un auxiliar que permite visualizar una imagen en frente del mensaje de aviso emergente: Helper.makeImageToast(context, R.drawable.my_image, "Toast with image", Toast.LENGTH_SHORT).show()

utilizo eso para indicar éxito, información o error. Hace una información tostadas más agradable y más expresiva ...

(Vale la pena mencionar que las bases de hackers en el hecho de que la tostada interna utiliza una LinearLayout por lo que no es del sistema y la aplicación independiente. Véanse los comentarios.)

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

Esto funciona solo si el diseño de Toast es del tipo 'LinearLayout'. No hay contacto afaik que el Toast siempre tendrá un LinearLayout. Su código trata con esto al no agregar la imagen, pero vale la pena señalar que esta solución no es independiente del dispositivo/versión. – Graeme

+0

@Graeme Tienes razón. gracias por la pista. La mejor manera sería recrear el brindis en un LinearLayout propio. Actualizaré mi respuesta cuando encuentre algo de tiempo para eso. – Knickedi

20

Simplemente, utilice la siguiente:

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

solución de Knickedi es buena, pero si sólo se necesita un icono junto al texto que se puede hacer uso del hecho de que la tostada tiene un TextView predefinido con la misma ID y establece el ícono en el TextV IEW:

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)); 
0

creo que esto es mejor que mostramos el texto de pan tostado en la imagen que se pasa a la función makeImageToast ... lo que da sombra a los códigos y Knickedi:

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 el uso de la misma:

utility.makeImageToast(getApplicationContext(), 
       R.drawable.your_image,"your_text",Toast.LENGTH_LONG).show(); 
Cuestiones relacionadas