質問

誰かが私を助けることができるのだろうか。 SMSを受信したときにトースト要素を表示しようとしています。このトーストには、画像(SMSアイコン)と2つのテキストビュー(送信者、メッセージ)を含むレイアウトが含まれている必要があります

アクティビティから次のメソッドを呼び出すと、期待どおりに動作します...

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

誰かが私が意図からそれを行う方法を助言してもらえますか?この問題はクロススレッドに何らかの関係があると思いますが、どうすればいいのかわかりません。オンラインでいくつかの例を見てきましたが、非推奨のコードを使用しているか、単純なテキストのみを表示しているようです

誰かが私を正しい方向に向けてくれますか

多くの感謝

役に立ちましたか?

解決

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

他のヒント

コンパイルエラーは、 BroadcastReceiver Context を継承しないためです。 onReceive()に渡される Context を使用します(そして getApplicationContext()を取り除きます-単に Context が渡されます)。

今、これは、 BroadcastReceiver から最初に Toast を上げることができるかどうかわからないため、まだ動作しない可能性があります、ただし、少なくともコンパイルエラーは発生しません。

トーストは、ブロードキャストレシーバーではなく、アクティビティまたはサービスから作成および表示できます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top