2010-08-11 19 views

Respuesta

133

Si son utilizando un AppWidgetProvider, se puede actualizar esta manera:

Intent intent = new Intent(this, MyAppWidgetProvider.class); 
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID, 
// since it seems the onUpdate() is only fired on that: 
int[] ids = AppWidgetManager.getInstance(getApplication()) 
    .getAppWidgetI‌​ds(new ComponentName(getApplication(), MyAppWidgetProvider.class)); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); 
sendBroadcast(intent); 
+0

aplausos que funcionaron perfectamente. –

+28

¿Dónde configura 'widgetId'? –

+1

¿AppWidgetProvider ejecuta luego el método onUpdate()? –

4

acaba de obtener una instancia AppWidgetManager y actualizar directamente. O bien, si está utilizando un IntentService para hacer las actualizaciones, llame al startService() en el IntentService. El AppWidgetProvider es un modo de actualizar el widget de la aplicación, pero no es la única.

+0

Soy nuevo en el sistema Android, ¿tiene un ejemplo de código rápido de su solución? – Kratz

+4

@Kratz: ¿Rápido? No. Ejemplo? Sí: http://github.com/commonsguy/cw-andtutorials/tree/master/34-AdvAppWidget/LunchList/ – CommonsWare

57

Esto ayudó cuando busqué en cómo actualizar un widget de un servicio/o acción (pero puede ser posible a partir de cada contexto):

Context context = this; 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1); 
ComponentName thisWidget = new ComponentName(context, MyWidget.class); 
remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis()); 
appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
+0

muy útil, gracias señor :) –

+3

Esto debe ser aceptada como la respuesta en mi humilde opinión –

+0

Sé que soy saltando aquí como 6 meses tarde. Pero estoy de acuerdo con Andrew. Probé el método original en este hilo. Y algo sobre cómo se agarran los identificadores hizo que comenzara a fallar. Este método (de actualizar directamente los campos manualmente) funciona mejor. Para mis propósitos, al menos. – durbnpoisn

11
int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class)); 

for (int id : widgetIDs) 
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view); 
} 
+1

Requiere nivel min-api: 11. –

+0

Impresionante. Ni siquiera tiene que buclear, hay una versión de 'notifyAppWidgetViewDataChanged()' que toma una matriz. –

26

Así que para actualizar un widget desde una acti vidad, puede hacerlo de esta manera:

Intent intent = new Intent(this, DppWidget.class); 
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); 
int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), DppWidget.class)); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); 
sendBroadcast(intent); 

Obras para mí :)

+0

Llama al método onRecieve override. Pero quiero llamar al método Update. –

+0

luego pruebe esto https://stackoverflow.com/a/4412949/6538897 – Idee

15

Prueba esto:

int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class)); 
     MyWidget myWidget = new MyWidget(); 
     myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids); 
+1

Sorprendentemente, solo esta pequeña respuesta lo resolvió. Todavía no sé las implicaciones de crear una instancia de la clase de Widget y llamar directamente al método onUpdate, pero bueno, finalmente funciona :) –

+0

La respuesta aceptada no funcionó ... Lo probaré. – Si8

+0

@ Si8 ¡Funciona como un encanto! –

8

En caso de que usted está trabajando con un widget que utiliza una colección como ListView , GridView, o StackView, para actualizar los elementos del widget, hacer de la siguiente manera:

Context context = getApplicationContext(); 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
ComponentName thisWidget = new ComponentName(context, StackWidgetProvider.class); 
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.stack_view); 

con este método notifyAppWidgetView DataChanged(), puede forzar a los elementos del widget a buscar cualquier dato nuevo en tiempo real.

+0

Esto en realidad era exactamente lo que estaba buscando. ¡Gracias! – user1806772

Cuestiones relacionadas