2009-10-24 33 views
5

Me pregunto si alguien puede ayudarme. Estoy tratando de mostrar un elemento de brindis cuando se recibe un SMS. Este pan tostado debe contener una disposición que tiene una imagen (SMS Icono) y 2 textviews (emisor, mensaje)Show Complex Toast de BroadcastReceiver

Si llamo al siguiente método de una actividad, que funciona como se espera ...

public void showToast(Context context, String name, String message) { 
    LayoutInflater inflater = getLayoutInflater(); 
    View layout = inflater.inflate(R.layout.toast_sms, 
            (ViewGroup) findViewById(R.id.toast_sms_root)); 

    TextView text = (TextView) layout.findViewById(R.id.toastsms_text); 
    text.setText(message); 

    Toast toast = new Toast(getApplicationContext()); 
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
    toast.setDuration(Toast.LENGTH_LONG); 
    toast.setView(layout); 
    toast.show(); 
} 

Sin embargo, si trato de llamar el mismo código de la misma manera SMSReceiver de mi, me sale:

The method getLayoutInflater() is undefined for the type SmsReceiver 
The method findViewById(int) is undefined for the type SmsReceiver 
The method getApplicationContext() is undefined for the type SmsReceiver 

puede alguien aconsejar por favor cómo puedo hacer tihs de una intención. Supongo que el problema está de alguna manera relacionado con el cross-threading, sin embargo, no estoy seguro de cómo proceder. He visto un par de ejemplos en línea pero parece que o bien utilice el código obsoleto o sólo muestran texto simple

Por favor alguien puede apuntar en la dirección correcta

Muchas gracias

+0

algún motivo/crítica constructiva para el downvote? – Basic

Respuesta

10

Puede usar LayoutInflater.from (context) para obtener su LayoutInflater. De esta manera:

LayoutInflater mInflater = LayoutInflater.from(context); 
View myView = mInflater.inflate(R.layout.customToast, null); 
TextView sender = (TextView) myView.findViewById(R.id.sender); 
TextView message = (TextView) myView.findViewById(R.id.message); 
+1

Eso lo hizo, muchas gracias :) – Basic

7

Sus errores de compilación, porque son BroadcastReceiver no hereda de Context. Use el Context que se pasa al onReceive() (y deshágase de getApplicationContext() - solo use el Context que se le pasa).

Ahora, esto puede todavía no funciona, ya que no estoy seguro de si se puede levantar una Toast de un BroadcastReceiver en el primer lugar, pero esto por lo menos le conseguir más allá de los errores de compilación.

+0

Gracias intentaré eso ahora – Basic

+0

Ok, ahora estoy haciendo un nuevo Toast (contexto) pero no ha resuelto los otros 2 errores de compilación: getLayoutInflater y findViewById. ¿Cómo puedo hacer referencia/instanciar estos? – Basic

+0

findViewById() solo existe en la actividad. Pase null como su segundo parámetro a la llamada de layout(). Para obtener un LayoutInflater, consulte la documentación de LayoutInflater en el SDK. – CommonsWare

2

Una tostada se crean y se muestran a partir de una actividad o servicio, no se emite el receptor

+0

descubrió esto de la manera difícil. –

+0

No, se puede mostrar una tostada desde un receptor de transmisión, funcionó para mí, por lo que es posible. –