Android按钮点击更新小部件

时间:2010-09-03 06:54:46

标签: android widget refresh android-appwidget

我有一个小部件,可以显示数据库中的一些信息。小部件每隔一小时定期更新一次。但我也允许用户通过单击widget上的刷新按钮手动更新它。如何执行单击操作并刷新小部件?

注意:小部件使用服务来执行操作。

提前完成。

2 个答案:

答案 0 :(得分:1)

我已经找了几个小时的答案,最后我已经弄明白了。在您的AppWidgetProvider中,在onUpdate中,在窗口小部件中循环,并为每个窗口小部件创建一个Intent(添加窗口小部件ID和一些数据以使其唯一,如意图uri),然后创建一个PendingIntent并将其分配给要在其中创建单击侦听器的视图。

    for(int i = 0; i<appWidgetIds.length; i++) {
        Intent serviceIntent = new Intent(context, MyService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
        serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent pendingServiceIntent = PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        views.setOnClickPendingIntent(R.id.refresh, pendingServiceIntent);

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

在我的特定情况下,我有两个点击监听器,一个用于刷新,一个用于启动设置活动,因此如果要启动一个活动,只需使用PendingIntent.getActivity并添加Intent.FLAG_ACTIVITY_NEW_TASK标志。

两者相结合:

    for(int i = 0; i<appWidgetIds.length; i++) {
        Intent serviceIntent = new Intent(context, MyService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
        serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent pendingServiceIntent = PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent settingsIntent = new Intent(context, SettingsActivity.class);
        settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        settingsIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
        settingsIntent.setData(Uri.parse(settingsIntent.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent pendingSettingsIntent = PendingIntent.getActivity(context, 0, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        views.setOnClickPendingIntent(R.id.title, pendingSettingsIntent);
        views.setOnClickPendingIntent(R.id.refresh, pendingServiceIntent);

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

希望这会对某人有所帮助。 :)

答案 1 :(得分:0)

我认为当用户点击* 刷新但 * n时,您必须重新加载小部件视图

//for refresh button
Intent refresh = new Intent(ctxt, WatchWidget_Honeycomb.class);
PendingIntent refreshIntent = PendingIntent.getBroadcast(ctxt, 0, refresh, 0);
widget.setOnClickPendingIntent(R.id.btn_Refresh, refreshIntent); 
appWidgetManager.updateAppWidget(new ComponentName(ctxt,WatchWidget_Honeycomb.class), widget);

如果您遇到任何问题,请发表评论。

快乐编码。