2010-06-14 8 views
2

J'ai un widget que vous appuyez et il alors il mettra à jour le texte sur le widget. J'ai mis un écouteur sur le clic pour lancer une autre activité pour effectuer la mise à jour de texte, mais pour une raison quelconque cela ne fonctionne que temporairement et alors il ne répondra pas et ne fera rien quand on le presse. Est-ce que quelqu'un sait pourquoi cela pourrait être fait? J'ai posté mon code de widget ci-dessous au cas où il serait utile.widget android ne répond pas

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { 
    thisWidget = new ComponentName(context, MemWidget.class); 
    Intent intent = new Intent(context, updatewidget.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

    // Get the layout for the App Widget and attach an on-click listener to the button 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
    views.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent); 

    // Tell the AppWidgetManager to perform an update on the current App Widget 
    appWidgetManager.updateAppWidget(thisWidget, views); 

} 

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    appWidgetManager = AppWidgetManager.getInstance(context); 
    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
    thisWidget = new ComponentName(context, MemWidget.class); 

    // v1.5 fix that doesn't call onDelete Action 
    final String action = intent.getAction(); 
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { 
     final int appWidgetId = intent.getExtras().getInt(
      AppWidgetManager.EXTRA_APPWIDGET_ID, 
      AppWidgetManager.INVALID_APPWIDGET_ID); 
      if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 
       this.onDeleted(context, new int[] { appWidgetId }); 
      } 
     } 
    else 
    { 
     super.onReceive(context, intent); 
    } 
} 

Voici le code qui est appelé de mon activité

thisWidget = new ComponentName(this, MemWidget.class); 
appWidgetManager = AppWidgetManager.getInstance(this); 
remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget); 

//do work 

remoteViews.setTextViewText(R.id.ImageButton01,"setting text here"); 
appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

Répondre

1

La méthode onUpdate il ne met pas à jour des données dans les RemoteViews autres que le PendingIntent, donc si c'est jamais appelé, la le widget reviendra à l'état défini dans R.layout.widget.

Avez-vous le code qui appelle updateAppWidget après l'interaction de l'utilisateur? Cela pourrait aussi aider. En outre, si la mise à jour est en ligne et ne nécessite aucune interface utilisateur, vous n'avez pas besoin de lancer une activité pour effectuer cette mise à jour. Il est plus efficace et ne perturbera pas la pile arrière si votre PendingIntent est plutôt pour un récepteur de diffusion, en utilisant PendingIntent.getBroadcast. Vous pouvez utiliser le même BroadcastReceiver que votre fournisseur de widget d'application. Vous n'en avez pas besoin d'autre.


Mise à jour: (Je ne peux pas répondre ci-dessous parce que le texte est trop long)

je ferais une fonction comme celui-ci, et appelle de votre activité de onUpdate(). Vous devrez sauvegarder le texte quelque part pour que vous puissiez également le passer de onUpdate(). Sinon, le texte sera réinitialisé par défaut dans R.layout.widget.

void updateWidget(Context context, CharSequence text) { 
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
    remoteViews.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent); 

    remoteViews.setTextViewText(R.id.ImageButton01, text); 

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    ComponentName thisWidget = new ComponentName(context, MemWidget.class); 
    appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
} 
+0

merci pour la réponse. J'ai ajouté le code qui appelle updateappwidget après l'interaction de l'utilisateur de l'activité lancée. Je vais changer le widget pour utiliser un broadcastreceiver au lieu de lancer une activité, ce qui n'est pas nécessaire. Lors de la recherche d'une solution, j'ai trouvé la réponse suivante: "Assurez-vous que tous les éléments PendingIntents sont envoyés avec chaque mise à jour RemoteViews, même s'ils ont déjà été réglés. RemoteViews mis en cache est appliqué dessus. " mais comment faire? – John

+0

Merci, ça a marché! – John