2010-11-29 10 views
6

Pracuję nad widgetem Android i działa świetnie na poziomie API 5 lub wyższym. To nie jest obsługiwane w ogóle na poziomie API 1 lub 2. Powinno działać absolutnie dobrze w wersjach 3 i 4, ale z jakiegoś powodu widget nie aktualizuje się.Dlaczego mój widget aplikacji nie jest aktualizowany w interfejsie API 3 lub 4?

Metoda onUpdate jest wywoływana i wykonywana bez błędów; jednak w 3 i 4 nie zmienia tekstu widżetu. Jestem prawie zagubiony. jakieś pomysły?

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 

    DataAccess helper = new DataAccess(context); 
    String text = helper.getCurrentText(); 
    helper.close(); 

    if (text != null) 
     views.setTextViewText(R.id.widget_text, text); 

    Intent intent = new Intent(context, WidgetDetailsActivity.class); 
    PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0); 
    views.setOnClickPendingIntent(R.id.widget, pending); 

    appWidgetManager.updateAppWidget(appWidgetIds, views); 
} 
+0

Czy debugujesz widżet? Czy otrzymujesz tekst zgodnie z oczekiwaniami? Czy oczekująca zamiar działa? Czy usługa onUpdate jest w ogóle wykonywana? – Kaj

+0

Tak, dołączyłem debugger i wszystko działało, z wyjątkiem zmiany tekstu. Mógłbym zmienić kolory, rozmiary, zachowania i wszystko inne, ale nie mogłem zmienić tekstu. Nie próbowałem go w 1.5 lub 1.6 w naprawdę długim czasie, ponieważ ta wersja staje się coraz bardziej przestarzała. –

+0

Dziwne. Mam widżety, które działają z wersją 1.5+ i nie miały żadnych problemów z aktualizowaniem tekstów. – Kaj

Odpowiedz

0

Spróbuj tego:

Pod koniec swojej metody aktualizacji trzeba wezwać Super.

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 

    DataAccess helper = new DataAccess(context); 
    String text = helper.getCurrentText(); 
    helper.close(); 

    if (text != null) 
     views.setTextViewText(R.id.widget_text, text); 

    Intent intent = new Intent(context, WidgetDetailsActivity.class); 
    PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0); 
    views.setOnClickPendingIntent(R.id.widget, pending); 

    appWidgetManager.updateAppWidget(appWidgetIds, views); 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 
+0

Próbowałem tego. Wciąż nie ma szczęścia. Wygląda na to, że w ogóle nie uruchamia on widoków zdalnych. –

0

Trzeba uruchomić usługę na metodę aktualizacji i umieścić cały kod w służbie również, tutaj daję onReceive i serwis demo context.startService(new Intent(context, UpdateService.class));

public static class UpdateService extends Service { 
    @Override 
    public void onStart(Intent intent, int startId) { 
     // Build the widget update for today 
     RemoteViews updateViews = buildUpdate(this); 
     // Push update for this widget to the home screen 
     ComponentName thisWidget = new ComponentName(this, 
       Widget.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(this); 
     manager.updateAppWidget(thisWidget, updateViews); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    final RemoteViews remoteViews = buildUpdate(context); 
    ComponentName cn = new ComponentName(context, Widget.class); 
    AppWidgetManager.getInstance(context).updateAppWidget(cn, remoteViews); 
    super.onReceive(context, intent); 
} 

gdzie buildUpdate jest metoda dla aktualizacji widget kod

Powiązane problemy