2009-10-24 12 views
5

Zastanawiam się, czy ktoś może mi pomóc. Próbuję wyświetlić element toast po odebraniu wiadomości SMS. To tosty powinny zawierać układ, który ma obrazu (SMS) i 2 Ikona TextView (nadawca, wiadomość)Show Complex Toast From BroadcastReceiver

Gdybym wywołać następującą metodę z działalności, to działa zgodnie z oczekiwaniami ...

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

jednak, gdy próbuję połączyć się z tego samego kodu w taki sam sposób z mojej SMSReceiver, otrzymuję:

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 

czy ktoś mógłby doradzić jak to zrobić Dzeije od intencji. Zakładam, że problem jest w jakiś sposób związany z przecinaniem wątków, ale nie jestem pewien, jak postępować. Widziałem kilka przykładów w Internecie, ale wydają się przestarzałe albo użycie kodu lub tylko wyświetlać prosty tekst

Może ktoś proszę wskaż mnie we właściwym kierunku

Dziękujemy

+0

jakiejkolwiek przyczyny/konstruktywnej krytyki dla downvote? – Basic

Odpowiedz

10

Możesz użyć LayoutInflater.from (kontekst), aby uzyskać swoją LayoutInflater. Tak:

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

To się udało, bardzo dziękuję :) – Basic

7

Twoje błędy kompilacji są dlatego BroadcastReceiver nie dziedziczy po Context. Użyj numeru Context, który jest przekazywany do onReceive() (i pozbądź się getApplicationContext() - po prostu użyj podanego Context).

Teraz, to może nadal nie działa, jak nie jestem pewien, czy można podnieść Toast od A BroadcastReceiver w pierwszej kolejności, ale to przynajmniej Ci przeszłości błędów kompilacji.

+0

Dzięki temu spróbuj teraz – Basic

+0

Ok, teraz robię nowy toast (kontekst), ale nie rozwiązał on innych 2 błędów kompilacji - getLayoutInflater i findViewById. Jak mogę odwołać/utworzyć ich wystąpienia? – Basic

+0

findViewById() istnieje tylko w działaniu. Podaj null jako drugi parametr wywołania layout(). Aby uzyskać LayoutInflater, zobacz dokumentację dla LayoutInflater w SDK. – CommonsWare

2

Toast mogą być tworzone i wyświetlane z działalności lub usługi, nie Odbiornik radiowy

+0

odkrył to na własnej skórze. –

+0

Nie, toast można wyświetlić z odbiornika telewizyjnego, zadziałało to dla mnie, więc jest to możliwe. –