多个可配置的小部件 - 更新问题

时间:2013-12-25 20:19:41

标签: android android-widget widget auto-update android-appwidget

当我添加单个小部件时,我可以正确配置它,并在初始配置后更新。但是当我添加具有相同或不同配置的小部件的第二个和下一个实例时,不会触发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);
            }

1 个答案:

答案 0 :(得分:0)

这个答案解决了这个问题: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);

并在widget的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);
}  

但我觉得这是一个黑客而不是一个好的解决方案,所以仍然欢迎更好的方式。