2009-10-24 15 views
5

Ich frage mich, ob jemand mir helfen kann. Ich versuche, ein Toast-Element anzuzeigen, wenn eine SMS empfangen wird. Dieser Toast soll ein Layout enthalten, die ein Bild (SMS Icon) und 2 Textviews hat (Absender, Nachricht)Show Complex Toast von BroadcastReceiver

Wenn ich die folgende Methode aus einer Tätigkeit nennen, funktioniert es wie erwartet ...

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

Allerdings, wenn ich versuche, den gleichen Code auf die gleiche Art und Weise von meinem SMSReceiver zu nennen, die ich erhalte:

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 

kann jemand bitte beraten, wie ich tihs von einer Absicht tun. Ich nehme an, dass das Problem irgendwie mit Cross-Threading zusammenhängt, aber ich bin mir nicht sicher, wie es weitergeht. Ich habe Online ein paar Beispiele gesehen, aber sie scheinen entweder Verwendung Code veraltet oder nur einfache Text anzeigen

Kann mir bitte jemand in die richtige Richtung zeigen

Vielen Dank

+0

Gibt es Gründe/konstruktive Kritik für die downvote? – Basic

Antwort

10

Sie können LayoutInflater.from (Kontext) verwenden, um Ihren LayoutInflater zu erhalten. Wie folgt aus:

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

Das tat es, vielen Dank :) – Basic

7

Ihre Kompilierung Fehler sind da BroadcastReceiver erbt nicht von Context. Verwenden Sie die Context, die in onReceive() übergeben wird (und getApplicationContext() loswerden - verwenden Sie einfach die Context Sie sind bestanden).

Nun, dies kann noch nicht funktionieren, da bin ich nicht sicher, wenn Sie eine Toast von einem BroadcastReceiver in erster Linie erhöhen können, aber dies zumindest werden Sie vorbei an den kompilieren Fehler erhalten.

+0

Danke, ich werde das jetzt versuchen – Basic

+0

Ok, ich mache jetzt neue Toast (Kontext), aber es hat nicht gelöst, th anderen 2 Kompilierfehler - getLayoutInFlater und findViewById. Wie kann ich diese referenzieren/instanziieren? – Basic

+0

findViewById() existiert nur in Aktivität. Übergeben Sie NULL als zweiten Parameter für den Aufruf von layout(). Informationen zum Abrufen eines LayoutInflaters finden Sie in der Dokumentation für LayoutInflater im SDK. – CommonsWare

2

Ein Toast erstellt und von einer Aktivität oder Service angezeigt werden, Broadcast nicht Empfänger

+0

fand dies auf die harte Tour. –

+0

Nein, kann ein Toast von einem Rundfunkempfänger angezeigt werden, hat es für mich funktioniert, so ist es möglich. –

Verwandte Themen