Показать сложный тост из BroadcastReceiver - PullRequest
5 голосов
/ 24 октября 2009

Интересно, кто-нибудь может мне помочь? Я пытаюсь отобразить элемент тоста при получении SMS. Этот тост должен содержать макет с изображением (значок SMS) и двумя текстовыми представлениями (отправитель, сообщение)

Если я вызываю следующий метод из действия, он работает как положено ...

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

Однако, если я попытаюсь вызвать тот же код тем же способом из моего SMSReceiver, я получу:

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

Может кто-нибудь, пожалуйста, посоветовать, как я могу сделать это из намерения. Я полагаю, что проблема как-то связана с многопоточностью, однако я не уверен, что делать дальше. Я видел несколько примеров в Интернете, но они, похоже, используют устаревший код или отображают только простой текст

Может кто-нибудь, пожалуйста, укажите мне в правильном направлении

Большое спасибо

Ответы [ 3 ]

10 голосов
/ 25 октября 2009

Вы можете использовать LayoutInflater.from (context), чтобы получить свой LayoutInflater. Как это:

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);
7 голосов
/ 24 октября 2009

Ваши ошибки компиляции вызваны тем, что BroadcastReceiver не наследуется от Context. Используйте Context, который передан в onReceive() (и избавьтесь от getApplicationContext() - просто используйте Context, который вы передали).

Теперь, это может все еще не работать, так как я не уверен, что вы можете поднять Toast с BroadcastReceiver во-первых, но это по крайней мере поможет вам пройти ошибки.

1 голос
/ 02 февраля 2012

Тост может быть создан и отображен из Активности или Сервиса, а не из широковещательного получателя

...