2011-01-07 5 views
8

Ho riscontrato un problema durante l'aggiornamento manuale del widget tramite AppWidgetManager.updateAppWidget. La piattaforma è Android 2.2.Il widget di controllo dell'alimentazione mostrato per un breve momento durante l'aggiornamento del mio widget tramite AppWidgetManager, qual è il problema?

Ecco il codice:
ho dichiarato il widget in aggiunta a un'attività esistente nel Manifesto:

<receiver android:name=".Widget" android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" /> 
</receiver> 

Il widget di classe è stato dichiarato nel Widget.java:

public class Widget extends AppWidgetProvider { 
@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    int use_static_ip; 
    RemoteViews remoteViews; 

    try { 
     use_static_ip = Settings.System.getInt(context.getContentResolver(), Settings.System.WIFI_USE_STATIC_IP); 
     if (use_static_ip == 0) { //DHCP 
      remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_dhcp); 
     } else { //static IP 
      remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_static); 
     } 
     Intent call_activity = new Intent(context, StaticIPToggle.class); 
     PendingIntent pending_call_activity = PendingIntent.getActivity(context, 0, call_activity, 0); 
     remoteViews.setOnClickPendingIntent(R.id.widget_icon, pending_call_activity); 
     appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
    } catch (SettingNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 

Nell'attività esistente ho aggiunto alcune linee per aggiornare manualmente il widget:

 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
     ComponentName componentName = new ComponentName(getApplicationContext(), Widget.class); 
     int[] ids = appWidgetManager.getAppWidgetIds(componentName); 
     Intent update_widget = new Intent(); 
     update_widget.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); 
     update_widget.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     getApplicationContext().sendBroadcast(update_widget); 

Ma ora ho questo errore: Se il widget è onClicked, mostra il widget di impostazioni energetiche per un breve periodo (~ 0,5sec-1sec) prima che venga mostrato il widget desiderato.

Ecco uno screenshot di questo problema (sequenza da sinistra a destra): http://i.stack.imgur.com/rHkjw.jpg

In primo luogo c'è il widget come nella foto a sinistra, poi cambia l'immagine di mezzo e uno rimane lì o modifiche all'immagine subito dopo ~ 0,5-1sec.

Purtroppo non vedo errori nel codice, vero?

Speriamo che si può aiutarmi a risolvere questo problema;) Grazie in anticipo, saluti, Oli

+0

Wow, sto avendo lo stesso problema; è bello vedere che non sono solo io, è un problema difficile da descrivere. Ottengo il bug con un HTC EVO 4G che esegue una ROM 2.2 personalizzata, ma non nell'emulatore. Il problema non si verifica anche con un Samsung Galaxy S. Qualcuno là fuori ha una soluzione? Ho lottato con questo per un po '. – Bobby

+0

Ho visto questo testando il widget scrollablecontacts con sorgenti che sono [qui] (http://code.google.com/p/scrollablecontacts/) in un programma di avvio personalizzato che tenta di aggiungere il widget per molti contatti. Potrebbe essere legato al tuo codice impiegare troppo tempo per caricare il contenuto del widget, forse il caricamento in un servizio avviato dalla classe widget? –

risposta

0

Ho avuto esattamente lo stesso problema. L'ho risolto aggiornando manualmente il widget NOT attraverso la trasmissione, ma chiamando direttamente AppWidgetManager.updateAppWidget(ComponentName, RemoteViews) invece da un AsyncTask.

Prova questa all'interno della classe Widget:

/** 
* Asynchronously builds views and updates the widget. 
*/ 
private static class UpdateWidgetTask extends AsyncTask<Void, Void, RemoteViews> { 
    private AppWidgetManager mAppWidgetManager; 
    private Context mContext; 

    private UpdateWidgetTask(AppWidgetManager appWidgetManager, Context context) { 
     mAppWidgetManager = appWidgetManager; 
     mContext = context; 
    } 

    @Override 
    protected RemoteViews doInBackground(Void... params) { 
     DebugLog.d(TAG, "Asynchronously updating widget."); 
     RemoteViews views = buildUpdate(mContext); 
     return views; 
    } 

    @Override 
    protected void onPostExecute(RemoteViews views) { 
     ComponentName thisWidget = new ComponentName(mContext, Widget.class); 
     mAppWidgetManager.updateAppWidget(thisWidget, views); 
    } 
} 

/** 
* Asynchronously updates all widgets of this type. This is the fastest way to update the widget. 
* 
* @param context The context. 
*/ 
public static void updateWidget(Context context) { 
    new UpdateWidgetTask(AppWidgetManager.getInstance(context), context).execute(); 
} 

quindi aggiornare chiamando Widget.updateWidget (questo) dalla vostra attività.

0

Ho utilizzato lo stesso modo programmatico per aggiornare manualmente il widget come hai fatto (da Is it possible to throw an intent for APPWIDGET_UPDATE programmatically?) e ho trovato che questa fosse la causa esatta del problema.

Questo succede ancora su 4.2 e 2.3, ROM ufficiali e non ufficiali (Touchwiz diventa assolutamente selvaggio quando ciò accade).

L'unico modo ho potuto risolvere questo problema è stato quello di rimuovere l'intero aggiornamento che coinvolge il broadcast e per aggiornare il widget in remoto inviando un regolare Broadcast al provider Widget e chiamando

ComponentName thisWidget = new ComponentName(context,AvailabilityWidgetProvider.class); 
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget,views); 

dall'interno onReceive

(Questo funziona per me come i miei widget sono identici)

In questo modo, il problema sembrava non verificarsi e ho potuto aggiornare il widget in remoto. Vecchia domanda, lo so, ma merita una risposta poiché questo era tutto ciò che riuscivo a trovare su questo strano problema.

Problemi correlati