2012-03-30 12 views
5

Mam naprawdę prosty appwidget (dwa widoki tekstu i przycisk). Przetestowałem to na tablecie Touchpad, Droid 1 i Droid Razr. Działa na wszystko oprócz Razra. Po dodaniu widżetu do ekranu głównego nie wyświetla się; to jest po prostu niewidzialne. Jeśli zatrzymam się w miejscu, w którym się znajduje, wybierze widżet, a gdy go przeniesię, widzę, że inne widżety znikają z drogi, ale są całkowicie niewidoczne.Android AppWidget nie wyświetla się w niektórych telefonach

Umieściłem kilka grzanek w metodach onReceive i onEnabled, a Toast wyświetla wszystkie właściwe informacje (tj. Działania i dodatki).

Ktoś ma jakieś doświadczenie z tym?

EDIT: Pamiętaj, to tylko do debugowania i nie śledzić najlepszych praktyk

public class GoogleTalkWidget extends AppWidgetProvider { 

    Button sendMessage; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Received Intent Action = " + 
       intent.getAction(), Toast.LENGTH_SHORT).show(); 

     if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
      RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.main_widget); 

      views.setTextViewText(R.id.widget_message, 
       (CharSequence)intent.getStringExtra("MESSAGE")); 

      views.setTextViewText(R.id.widget_sender, 
       (CharSequence)intent.getStringExtra("SENDER")); 

      Toast.makeText(context, "Received " + 
       intent.getStringExtra("MESSAGE") + " FROM " + 
       intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

      ComponentName cn = new ComponentName(context, 
       GoogleTalkWidget.class); 

      AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 

     } 
     super.onReceive(context, intent); 
    } 

    @Override 
    public void onEnabled(final Context context){ 
     super.onEnabled(context); 

     Toast.makeText(context, "Enabled", Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

'onReceive()'? Masz na myśli 'onUpdate()' swojego 'AppWidgetProvider'? – CommonsWare

+0

możesz również zastąpić metodę 'onReceive()' w appwidget ... Myślę, że ją zostawili, ponieważ wcześniejsze wersje Androida miały pewne problemy z 'onDelete' – Eliezer

+0

Rozumiem to. Jednakże, 'onUpdate()' jest na ogół tym, gdzie dostarczasz 'RemoteViews', aby zadeklarować, co powinno się znaleźć w widżecie aplikacji. Czy wywoływane jest 'onUpdate()' i czy pomyślnie dostarczasz 'RemoteViews'? Czy jest coś w LogCat, które może odnosić się (np. Ślady stosu)? – CommonsWare

Odpowiedz

1

Najlepszą rzeczą, jaką mogę myśleć o (rzekomej nie jest błąd lub inny problem z launcher na Razr) jest to, że twoje zasoby nie są poprawnie skonfigurowane. Może Razr ma inną gęstość dpi i nie ma zasobów dla tej gęstości w twoim projekcie.

Spróbuj na przykład przenieść wszystkie rysunki tworzące widżet do folderu res \ drawable-nodpi i zobaczyć, jak idzie.

EDIT: Widziałem coś dziwnego w kodzie

w klasie GoogleTalkWidget metody onReceive, widżet jest aktualizowany tylko wtedy, gdy otrzymał wiadomość Utils.RECEIVED_MESSAGE_WIDGET. Nie wiem, czym jest ta wiadomość, ale widżet aplikacji, po raz pierwszy jest dodawany na ekranie głównym, otrzymuje plik android.appwidget.action.APPWIDGET_UPDATE i wszelkie inne filtry zamiarów są zarejestrowane w pliku manifestu i są one nadawane przez system w tym czasie (oczywiście i oczywiście z nadawania lepkich transmisji).

Gdybym był na twoim miejscu bym zmienić metodę onReceive następująco:

@Override 
public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Received Intent Action = " + 
      intent.getAction(), Toast.LENGTH_SHORT).show(); 
    super.onReceive(context, intent); 

    String msg = "No messages yet"; 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.main_widget); 

    if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
     msg = intent.getStringExtra("MESSAGE"); 

     views.setTextViewText(R.id.widget_sender, 
      (CharSequence)intent.getStringExtra("SENDER")); 

     Toast.makeText(context, "Received " + 
      intent.getStringExtra("MESSAGE") + " FROM " + 
      intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

     ComponentName cn = new ComponentName(context, 
      GoogleTalkWidget.class); 
    } 

    views.setTextViewText(R.id.widget_message, msg); 

    AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 
} 

i zobaczyć co się dzieje.

Jeśli twój widżet się nie pojawi, może to być problem z Razr, ale jest inaczej, ponieważ przypuszczam, że cała gama innych widgetów działa dobrze.

Co więcej, chociaż twój kod służy wyłącznie do debugowania, twoje podejście jest trochę problematyczne. Najlepszym miejscem do aktualizacji widoków widgetów jest metoda onUpdate AppWidgetProvider, a nie onReceive. Android udostępnia w tym celu metodę onUpdate, a onReceive informuje o nadejściu zarejestrowanej transmisji. Podstawową różnicą jest to, że w metodzie onUpdate Android wyodrębnił wszystkie potrzebne parametry z otrzymanych dodatków Intent. Jeszcze jedną rzeczą dotyczącą aktualizacji widgetów jest zapewnienie wartości android: updatePeriodMillis innej niż 0 (2100000 to dobra wartość) w pliku XML widgetu, nawet jeśli nie chcesz okresowych aktualizacji widgetu. Widziałem gdzieś, że metoda onReceive może nie zostać wywołana, jeśli ta wartość wynosi 0.

Należy pamiętać, że AppWidgetProvider jako Broadcast Receiver funkcjonuje tylko tak długo, jak metoda onReceive wykonuje swoją pracę, po czym jest niszczona, więc nie jest dobrym miejscem na "interaktywny" kod, jak np. słuchacze UI itp. Mówię ci to, ponieważ masz deklarację Button (Button sendMessage;) na górze twojej klasy GoogleTalkWidget.

Mam nadzieję, że to pomoże ...

+0

Teraz próbuję tylko zmusić go do pracy, więc jego bardzo nagie kości ... .no drawables lub coś w tym stylu ... tylko widok tekstowy i przycisk – Eliezer

+0

@Eliezer Zobacz moją zmienioną odpowiedź ... – Christos

+0

Co do treści 'onReceive', to nie aktualizowałem tego posta, ponieważ o nim zapomniałem i przeniósł się, gdy nadal nie mogłem rozwiązać problemu. Odkąd napisałem to pytanie, próbowałem wziąć fragment kodu, dopóki nie miałem tylko 'onUpdate', który nazwał' super' i to było to; wciąż nie działa. Jeśli chodzi o 'onUpdate' vs' onReceive', nie zastanawiałem się zbyt wiele, ponieważ ten projekt przeszedł na backburner z powodu tego problemu z Razr, ale twój wkład jest doceniany! – Eliezer

Powiązane problemy