多个可配置的小部件

当我添加单个小部件时,我可以正确配置它,并且在初始配置之后按照应有的更新。 但是,当我添加具有相同或不同配置的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