views:

659

answers:

2

Hi,

I wonder if someone can help me. I'm trying to display a toast element when an SMS is received. This toast should contain a layout which has an image (SMS Icon) and 2 textviews (sender, message)

If I call the following method from an activity, it works as expected...

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

However, if I try to call the same code in the same way from my SMSReceiver, I get:

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

Can someone please advise how I can do tihs from an intent. I assume the issue is somehow related to cross-threading however, I'm unsure how to proceed. I've seen a couple of examples online but they seem to either use deprecated code or only display simple text

Can someone please point me in the correct direction

Many thanks

+2  A: 

Your compile errors are because BroadcastReceiver does not inherit from Context. Use the Context that is passed into onReceive() (and get rid of getApplicationContext() -- just use the Context you are passed).

Now, this may still not work, as I am not sure if you can raise a Toast from a BroadcastReceiver in the first place, but this will at least get you past the compile errors.

CommonsWare
Thanks i'll try that now
Basiclife
Ok, I'm now doing new Toast(context) but it hasn't resolved th other 2 compile errors - getLayoutInflater and findViewById. How can I reference/instantiate these?
Basiclife
findViewById() only exists in Activity. Pass in null as your second parameter to the layout() call. To get a LayoutInflater, see the documentation for LayoutInflater in the SDK.
CommonsWare
+2  A: 

You can use LayoutInflater.from(context) to get your LayoutInflater. Like this:

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);
Tim H
That did it, many thanks :)
Basiclife