2010-08-25 14 views
9

Widget'ımdaki bir düğme, bir güncelleştirmeyi zorlamak için widget sınıfındaki APPWIDGET_UPDATE amacını tetiklemesini ister ancak APPWIDGET_UPDATE öğesini Intent'teki statik alan olarak görmüyorum.APPWIDGET_UPDATE için programlı olarak bir amaç atmak mümkün mü?

Bu mümkün mü ve nasıl yapılır?

Intent intent = new Intent(context, BaseWidgetProvider.class); 
intent.setAction({APPWIDGET_UPDATE INTENT HERE}) 
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

views.setOnClickPendingIntent(R.id.MyWidgetButton, pendingIntent); 

cevap

15

Evet, bu mümkün. Sen AppWidgetManager harekete bulabilirsiniz:

intent.setAction (AppWidgetManager.ACTION_APPWIDGET_UPDATE)

Edit: Sen güncellemek istediğiniz widget kimlikleri sağlamanız gerekir. Aşağıda tam bir örnek.

AppWidgetManager widgetManager = AppWidgetManager.getInstance(context); 
ComponentName widgetComponent = new ComponentName(context, YourWidget.class); 
int[] widgetIds = widgetManager.getAppWidgetIds(widgetComponent); 
Intent update = new Intent(); 
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds); 
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
context.sendBroadcast(update); 
+0

Teşekkürler. Adb logcat'ta niyet ateşini görüyorum, ancak widget güncellenmiyor. Yapmam gereken başka bir şey var mı? Benim manifest dosyasımda zaten bir niyet filtresi olarak APPWIDGET_UPDATE var. – NPike

+0

'onUpdate()' çağrılmıyor mu? Sana bu konuda geri dönmeliyim. – Justin

+0

Güncellemek için widget'ların kimliklerini sağlamanız gerekecektir. Widget'ınızın tüm örneklerini güncellemek isterseniz, "AppWidgetManager" dan tam bir ids listesi edinebilirsiniz (yorumumu, kodu eklemek üzere düzenledim). – Justin

2

Bunun çok eski bir soru olduğunu biliyorum, ancak bunun ilginç olabileceğini düşünüyorum çünkü Android, AppWidgets yenileme politikalarını güncelledi. Bence bu değişiklik, beklenen yanıtın beklendiği gibi çalışmasını engelleyebilir.

Bu benim çözümüm, RemoteViews kullanarak ve bir koleksiyon.

public static final String ACTION_WIDGET_UPDATE = "com.yourpackage.widget.ACTION_UPDATE"; 

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(ACTION_WIDGET_UPDATE)) { 
     int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); 
     AppWidgetManager.getInstance(context) 
       .notifyAppWidgetViewDataChanged(widgetId, R.id.widgetColectionRoot); 
    } 
    super.onReceive(context, intent); 
} 

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
        int[] appWidgetIds) { 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
    for (int widgetId : appWidgetIds) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      RemoteViews collectionRemoteView = getRemoteViews(widgetId, context); 
      appWidgetManager.updateAppWidget(widgetId, collectionRemoteView); 
     } 

    } 
} 

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
@SuppressWarnings("deprecation") 
private RemoteViews getRemoteViews(int widgetId, Context context) { 
    // Sets up the intent that points to the RemoteViewService 
    // that will 
    // provide the views for this collection. 
    Intent widgetUpdateServiceIntent = new Intent(context, 
      RemoteViewsService.class); 
    widgetUpdateServiceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
    // When intents are compared, the extras are ignored, so we need 
    // to embed the extras 
    // into the data so that the extras will not be ignored. 
    widgetUpdateServiceIntent.setData(
      Uri.parse(widgetUpdateServiceIntent.toUri(Intent.URI_INTENT_SCHEME))); 
    RemoteViews collectionRemoteView = new RemoteViews(context.getPackageName(), 
      R.layout.widget_collection); 
    collectionRemoteView.setRemoteAdapter(widgetId, 
      R.id.widgetColectionRoot, widgetUpdateServiceIntent); 

    collectionRemoteView.setEmptyView(R.id.widgetColectionRoot, R.id.widgetEmpty); 

    // This section makes it possible for items to have 
    // individualized behavior. 
    // It does this by setting up a pending intent template. 
    // Individuals items of a collection 
    // cannot set up their own pending intents. Instead, the 
    // collection as a whole sets 
    // up a pending intent template, and the individual items set a 
    // fillInIntent 
    // to create unique behavior on an item-by-item basis. 
    Intent selectItemIntent = new Intent(context, 
      BrochuresWidgetProvider.class); 

    Intent refreshIntent = new Intent(selectItemIntent); 
    refreshIntent.setAction(ACTION_WIDGET_UPDATE); 
    PendingIntent refreshPendingIntent = PendingIntent.getBroadcast(
      context, 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    collectionRemoteView.setOnClickPendingIntent(R.id.widgetReload, 
      refreshPendingIntent); 
    return collectionRemoteView; 
} 

Elbette, ayrıca Widget sağlayıcı beyanı içinde Bildiriminize o niyet-filtreyi kaydetmeniz gerekir.

İlgili konular