在Android中更新应用程序小部件的多个实例
试图创建应用程序小部件的多个实例并分别更新每个实例,但找不到它不能正常工作的原因。以下是代码,从中收集并稍作修改:在Android中更新应用程序小部件的多个实例,android,user-interface,android-widget,Android,User Interface,Android Widget,试图创建应用程序小部件的多个实例并分别更新每个实例,但找不到它不能正常工作的原因。以下是代码,从中收集并稍作修改: package com.example.widgetagain; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName;
package com.example.widgetagain;
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 MyWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
for (int appWidSingle = 0; appWidSingle < appWidgetIds.length; appWidSingle++) {
// initializing widget layout
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_main);
// register for button event
remoteViews.setOnClickPendingIntent(R.id.sync_button,
buildButtonPendingIntent(context, appWidSingle));
// updating view with initial data
remoteViews.setTextViewText(R.id.title, getTitle());
remoteViews.setTextViewText(R.id.desc, getDesc());
// request for widget update
pushWidgetUpdate(context, remoteViews, appWidSingle);
}
}
public static PendingIntent buildButtonPendingIntent(Context context, int appWidgetSingleId) {
++MyWidgetIntentReceiver.clickCount;
Intent clickIntent = new Intent(context, MyWidgetIntentReceiver.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetSingleId);
clickIntent.setAction("WidgetUtils.WIDGET_UPDATE_ACTION");
return PendingIntent.getBroadcast(context, appWidgetSingleId, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// initiate widget update request
/*Intent intent = new Intent();
intent.setAction("WidgetUtils.WIDGET_UPDATE_ACTION");
return PendingIntent.getBroadcast(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);*/
}
private static CharSequence getDesc() {
return "Sync to see some of our funniest joke collections";
}
private static CharSequence getTitle() {
return "Funny Jokes";
}
public static void pushWidgetUpdate(Context context, RemoteViews remoteViews, int appWidgetSingleId) {
AppWidgetManager manager = AppWidgetManager.getInstance(context);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_main);
Intent clickIntent = new Intent(context, MyWidgetIntentReceiver.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetSingleId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetSingleId, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.sync_button, pendingIntent);
manager.updateAppWidget(appWidgetSingleId, views);
}
}
根据您发布的内容,似乎:
// request for widget update
pushWidgetUpdate(context, remoteViews, appWidSingle);
应该是这样的:
// request for widget update
pushWidgetUpdate(context, remoteViews, appWidgetIds[appWidSingle]);
同样地:
// register for button event
remoteViews.setOnClickPendingIntent(R.id.sync_button,
buildButtonPendingIntent(context, appWidSingle));
应该是:
// register for button event
remoteViews.setOnClickPendingIntent(R.id.sync_button,
buildButtonPendingIntent(context, appWidgetIds[appWidSingle]));
根据您发布的内容,似乎:
// request for widget update
pushWidgetUpdate(context, remoteViews, appWidSingle);
应该是这样的:
// request for widget update
pushWidgetUpdate(context, remoteViews, appWidgetIds[appWidSingle]);
同样地:
// register for button event
remoteViews.setOnClickPendingIntent(R.id.sync_button,
buildButtonPendingIntent(context, appWidSingle));
应该是:
// register for button event
remoteViews.setOnClickPendingIntent(R.id.sync_button,
buildButtonPendingIntent(context, appWidgetIds[appWidSingle]));
除了j_um提到的错误之外,这部分代码也不正确:
public static void pushWidgetUpdate(Context context, RemoteViews remoteViews, int appWidgetSingleId) {
AppWidgetManager manager = AppWidgetManager.getInstance(context);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_main);
Intent clickIntent = new Intent(context, MyWidgetIntentReceiver.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetSingleId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetSingleId, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.sync_button, pendingIntent);
manager.updateAppWidget(appWidgetSingleId, views);
}
i、 e每次都在创建新的remoteview,而不是在pushwidgetupdate方法中使用传递的remoteview。因此,上述代码更改为:
public static void pushWidgetUpdate(Context context, RemoteViews remoteViews, int appWidgetSingleId) {
AppWidgetManager manager = AppWidgetManager.getInstance(context);
Intent clickIntent = new Intent(context, MyWidgetIntentReceiver.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetSingleId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetSingleId, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.sync_button, pendingIntent);
manager.updateAppWidget(appWidgetSingleId, views);
}
除了j_um提到的错误之外,这部分代码也不正确:
public static void pushWidgetUpdate(Context context, RemoteViews remoteViews, int appWidgetSingleId) {
AppWidgetManager manager = AppWidgetManager.getInstance(context);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_main);
Intent clickIntent = new Intent(context, MyWidgetIntentReceiver.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetSingleId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetSingleId, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.sync_button, pendingIntent);
manager.updateAppWidget(appWidgetSingleId, views);
}
i、 e每次都在创建新的remoteview,而不是在pushwidgetupdate方法中使用传递的remoteview。因此,上述代码更改为:
public static void pushWidgetUpdate(Context context, RemoteViews remoteViews, int appWidgetSingleId) {
AppWidgetManager manager = AppWidgetManager.getInstance(context);
Intent clickIntent = new Intent(context, MyWidgetIntentReceiver.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetSingleId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetSingleId, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.sync_button, pendingIntent);
manager.updateAppWidget(appWidgetSingleId, views);
}
是否至少更新了一个实例?否,原始代码更新。在我改变之后,甚至一个都没有。仅创建具有背景和按钮的小部件,并更新至少一个实例?否,原始代码更新。在我改变之后,甚至一个都没有。仅创建具有背景和按钮的小部件我还建议将变量appWidSingle重命名为类似index的名称,以明确它只是一个索引,而不是实际的小部件id。是的,你是对的,而且我还必须纠正我答案中的另一个错误。谢谢:我还建议将变量appWidSingle重命名为类似index的名称,以明确它只是一个索引,而不是实际的小部件id。是的,你是对的,而且我还必须纠正我答案中的另一个错误。谢谢: