2010-11-29 34 views
6

Je travaille sur un widget Android et il fonctionne très bien au niveau API 5 ou supérieur. Il n'est pas pris en charge du tout au niveau API 1 ou 2. Il devrait fonctionner parfaitement à 3 et 4, mais pour une raison quelconque, le widget ne se met pas à jour.Pourquoi le widget de mon application ne se met-il pas à jour dans l'API 3 ou 4?

La méthode onUpdate est appelée et s'exécute sans erreur; cependant, en 3 et 4 cela ne change pas le texte du widget. Je suis à peu près perdue. Des pensées?

@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

Avez-vous débogué le widget? Obtenez-vous le texte comme prévu? L'intention en attente fonctionne-t-elle? L'onUpdate est-il exécuté? – Kaj

+0

Ouais, j'ai attaché le débogueur et tout a fonctionné sauf le changement de texte. Je pourrais changer les couleurs, les tailles, les comportements, et tout cela, mais je ne pouvais pas changer le texte. Je ne l'ai pas essayé en 1.5 ou 1.6 depuis très longtemps car cette version devient de plus en plus obsolète. –

+0

Étrange. J'ai des widgets qui fonctionnent avec 1.5+, et n'ont eu aucun problème avec la mise à jour des textes. – Kaj

Répondre

0

Essayez ceci:

A la fin de votre méthode de mise à jour vous devez appeler le 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

J'ai essayé ceci. Toujours pas de chance. Il ne semble pas du tout exécuter les vues distantes. –

0

Vous devez démarrer le service sur la méthode de mise à jour et de mettre votre tout le code en service aussi, ici, je donne OnReceive et le service démo 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); 
} 

buildUpdate est la méthode pour votre mise à jour widget code