button点击事件的Android小部件

我有一个android小部件,每10分钟从服务器获取数据并将其显示在屏幕上。
我想添加一个“刷新”button,该小部件。
当用户点击那个button时,我想运行从服务器获取信息的方法。
向应用程序中的button添加事件处理程序非常简单,但是我找不到一个小部件的示例。
我想获得一些帮助,添加一个function的button点击一个小部件。

下面是一个应该有所帮助的例子:

package com.automatic.widget; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; public class Widget extends AppWidgetProvider { private static final String SYNC_CLICKED = "automaticWidgetSyncButtonClick"; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { RemoteViews remoteViews; ComponentName watchWidget; remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); watchWidget = new ComponentName(context, Widget.class); remoteViews.setOnClickPendingIntent(R.id.sync_button, getPendingSelfIntent(context, SYNC_CLICKED)); appWidgetManager.updateAppWidget(watchWidget, remoteViews); } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub super.onReceive(context, intent); if (SYNC_CLICKED.equals(intent.getAction())) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews remoteViews; ComponentName watchWidget; remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); watchWidget = new ComponentName(context, Widget.class); remoteViews.setTextViewText(R.id.sync_button, "TESTING"); appWidgetManager.updateAppWidget(watchWidget, remoteViews); } } protected PendingIntent getPendingSelfIntent(Context context, String action) { Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); } } 

我发现如何做到这一点。
将操作添加到> <receiver><intent-filter>标记中的AndroidManifest.xml文件中:

 <action android:name="MY_PACKAGE_NAME.WIDGET_BUTTON" /> 

在提供程序中添加一个匹配操作名称的常量:

 public static String WIDGET_BUTTON = "MY_PACKAGE_NAME.WIDGET_BUTTON"; 

onUpdate()方法中添加一个匹配操作的挂起的意图:

 Intent intent = new Intent(WIDGET_BUTTON); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.MY_BUTTON_ID, pendingIntent ); 

最后,在onRecieve()方法中,检查操作名称:

  if (WIDGET_BUTTON.equals(intent.getAction())) { //your code here } 
 protected PendingIntent getPendingSelfIntent(Context context, String action) { Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); } views.setOnClickPendingIntent(R.id.Timm, getPendingSelfIntent(context, "ham")); 

另外更喜欢url:

如何正确处理Widget上的点击事件

如果你用不同的方式解决问题,请提供这个答案

这是另一个答案,具有以下好处:

  • 它处理所有的App Widget实例(用户可能在你的屏幕上有不同的configuration/尺寸的多个widget实例)。 所有实例的编码是官方文档规定的。 请参阅指南> App Widgets>使用AppWidgetProvider类 ,向下滚动到“ExampleAppWidgetProvider”的代码示例。
  • onReceive中的主要代码实际上调用onUpdate (这样可以减less代码重复)。
  • onUpdate(Context context)的代码是泛化的,所以它可以被放到任何AppWidgetProvider子类中。

代码:

 public class MyWidget extends AppWidgetProvider { private static final String ACTION_UPDATE_CLICK = "com.example.myapp.action.UPDATE_CLICK"; private static int mCount = 0; private static String getMessage() { return String.valueOf(mCount++); } private PendingIntent getPendingSelfIntent(Context context, String action) { // An explicit intent directed at the current class (the "self"). Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); String message = getMessage(); // Loop for every App Widget instance that belongs to this provider. // Noting, that is, a user might have multiple instances of the same // widget on // their home screen. for (int appWidgetID : appWidgetIds) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.my_widget); remoteViews.setTextViewText(R.id.textView_output, message); remoteViews.setOnClickPendingIntent(R.id.button_update, getPendingSelfIntent(context, ACTION_UPDATE_CLICK) ); appWidgetManager.updateAppWidget(appWidgetID, remoteViews); } } /** * A general technique for calling the onUpdate method, * requiring only the context parameter. * * @author John Bentley, based on Android-er code. * @see <a href="http://android-er.blogspot.com * .au/2010/10/update-widget-in-onreceive-method.html"> * Android-er > 2010-10-19 > Update Widget in onReceive() method</a> */ private void onUpdate(Context context) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance (context); // Uses getClass().getName() rather than MyWidget.class.getName() for // portability into any App Widget Provider Class ComponentName thisAppWidgetComponentName = new ComponentName(context.getPackageName(),getClass().getName() ); int[] appWidgetIds = appWidgetManager.getAppWidgetIds( thisAppWidgetComponentName); onUpdate(context, appWidgetManager, appWidgetIds); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (ACTION_UPDATE_CLICK.equals(intent.getAction())) { onUpdate(context); } } } 

小部件看起来像这样

小部件更新按钮示例。简单的计数。

这build立在@Kels,@SharonHaimPour和@ Erti-ChrisEelmaa的getPendingSelfIntent工作上。

它也build立在onReceive()方法 (不是我)上的Android-er> 2010-10-19> Update Widget中 ,并在App Widget实例的基础上演示如何从onReceive调用onUpdate。 我把这个代码做成一般的,并把它包装在callOnUpdate