2010-07-26 3 views
1

J'ai décidé de créer mon premier widget Android ce week-end et bien que je l'ai fait fonctionner un peu, il n'affiche pas le contenu chargé dynamiquement jusqu'à ce que je tourne l'appareil (en utilisant Launcher Pro Plus qui permet l'orientation paysage et la rotation des écrans d'accueil).Android: Widget ne charge pas le contenu lors de la création

Le widget est assez simple, il récupère juste une image d'un site Web et affiche l'image. J'ai créé un service démarré dans onUpdate() de la sous-classe AppWidgetProvider. Le service récupère ensuite l'image, construit l'objet RemoteViews, puis appelle updateAppWidget() sur AppWidgetManager. Voici le code pour le widget:

public class PropagationWidget extends AppWidgetProvider { 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    context.startService(new Intent(context, UpdateService.class)); 
} 
public static class UpdateService extends IntentService { 

    public UpdateService() { 
     super("PropagationWidget$UpdateService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     ComponentName me=new ComponentName(this, 
       PropagationWidget.class); 
     AppWidgetManager mgr=AppWidgetManager.getInstance(this); 

     mgr.updateAppWidget(me, buildUpdate(this)); 
    } 

    public RemoteViews buildUpdate(Context context) { 
     RemoteViews views = null; 

     URL imageUrl = null; 

     try { 
      views = new RemoteViews(context.getPackageName(), 
        R.layout.widget_layout); 

      imageUrl = new URL(
        "http://www.mountainlake.k12.mn.us/ham/aprs/path.cgi?map=na&img=node&freq=144&type=image"); 

      InputStream is = (InputStream) imageUrl.getContent(); 
      Bitmap image = BitmapFactory.decodeStream(is); 
      views.setImageViewBitmap(R.id.image, image); 

      Time today = new Time(); 
      today.setToNow(); 

      views.setTextViewText(R.id.last_updated, "Last updated: " + today.format("%D %r")); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return views; 
    } 
} 

Lorsque le chargement du widget, je reçois seulement le cadre du widget, mais pas de contenu, ce qui est logique car UpdateService n'a toujours pas récupéré encore l'image du site. Cependant, même après que UpdateService a fini de récupérer l'image et les appels immédiats updateAppWidget(), l'image n'apparaît toujours pas. Lorsque je fais pivoter l'appareil, cependant, l'image apparaît et restera lors des rotations suivantes.

De même, le widget est défini dans le XML du fournisseur d'application pour être mis à jour toutes les 30 minutes. Ces mises à jour n'apparaissent pas jusqu'à ce que je fasse pivoter l'appareil, et lorsque le widget est redessiné, je vois alors la mise à jour.

Y at-il quelque chose de vraiment basique ici qui me manque? Toute idée serait grandement apprécié! S'il vous plaît laissez-moi savoir si je devrais fournir des informations supplémentaires pour aider à cela.

Répondre

0

Je suis en train de faire quelque chose de similaire et mon UpdateService met à jour le widget de la manière suivante:

 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());int [] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(getApplicationContext(),WidgetProvider.class)); 
     for (int i=0; i<appWidgetIds.length; i++) 
     { 
      RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(), 
        R.layout.widget_layout); 

      //Set Image Resource/Bitmap from Web here like: remoteViews.setImageViewBitmap(viewId, bitmap); 


      appWidgetManager.updateAppWidget(appWidgetIds[i], views); 
     } 

Mais gardez à l'esprit que les mises à jour fréquentes d'un widget peut vider la batterie trop vite.

Questions connexes