多个可配置的小部件
当我添加单个小部件时,我可以正确配置它,并且在初始配置之后按照应有的更新。 但是,当我添加具有相同或不同配置的onUpdate的第二个和下一个小部件实例未触发时。 那么,具体onUpdate是在配置设置之前执行的,当配置活动处于最佳状态时,它的工作原理如下:
1部件 - 确定
2个小部件 - 第一次确定,第二次未更新
3个小工具 - 第一个确定,第二个确定,第三个未更新
等等。
在Android 4.3上测试的行为。 我不知道为什么更新不能按预期的方式工作。
配置活动中的“确定”按钮(直接从:http://developer.android.com/guide/topics/appwidgets/index.html#Configuring):
public void ok(View v){
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_lay);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
Log.e("mAppWidgetId", "id: "+mAppWidgetId);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
saveSettings();
finish();
}
Widget Provider中的OnUpdate部件:
ComponentName thisWidget = new ComponentName(context, MyWidget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
int myConfig = settings.getInt("myConfig"+widgetId, -1);
if(myConfig != -1){
Log.d("widget id", widgetId+" ");
updateWidget(db, widgetId, myConfig);
}
这个答案解决了这个问题:https://stackoverflow.com/a/5363553/1449961:
问题出现在NOT SENDING ACTION_APPWIDGET_UPDATE,因此在关闭首选项之前,我发送广播:
Intent updateIntent = new Intent(this, CallBackWidget.class);
updateIntent.setAction("PreferencesUpdated");
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
sendBroadcast(updateIntent);
并在onReceive方法的小部件我检查广播:
if ("PreferencesUpdated".equals(action)) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
appWidgetManager.updateAppWidget(appWidgetId, views);
int[] appWidgetIds = new int[] {appWidgetId};
onUpdate(context, appWidgetManager, appWidgetIds);
}
但我觉得这是一种黑客而不是一个好的解决方案,所以更好的方式仍然是受欢迎的。
链接地址: http://www.djcxy.com/p/50609.html上一篇: Multiple, configurable widgets
下一篇: Saving ToggleButton state in ListView by using SharedPreferences