3

根据 AppWidgetProvider 中关于 onAppWidgetOptionsChanged 的​​文档:“在第一次放置小部件时以及任何时候调整小部件的大小时都会调用它。”

但是,当我将小部件放在 Android 4.2 和 4.3 中的股票启动器上时,不会立即调用此方法(仅在我调整小部件大小后)。我在自己的应用程序以及 CommonsWare 的https://github.com/commonsguy/cw-omnibus/tree/master/AppWidget/Resize上进行了尝试

有什么我想念的吗?

编辑:我发现使此方法正常工作的唯一启动器,如 Google 文档所述,是 Action Launcher Pro;干得好,谢谢,克里斯·莱西!为什么股票启动器不起作用?其他人有这个问题吗?

4

2 回答 2

9

感谢您关注这个问题。我将更新 Android 文档以反映这一点。

但是,我们建议不要在 onUpdate() 中强制调用 onAppWidgetOptionsChanged(),而是推荐如下方法:

public class AppWidget extends AppWidgetProvider {

    .... 

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {

super.onUpdate(context, appWidgetManager, appWidgetIds);

final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];
            Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
            updateWidget(context, appWidgetManager, appWidgetId, options);
        }

}


public void onAppWidgetOptionsChanged (Context context, AppWidgetManager 
        appWidgetManager, int appWidgetId, Bundle newOptions) {

    updateWidget(context, appWidgetManager, appWidgetId, newOptions);
}

private void updateWidget(Context context, AppWidgetManager appWidgetManager,

        int appWidgetId, Bundle options) {

    // Do whatever you need to do to the widget. Include any customization based
    // on the size, included in the options. Be sure to have a graceful fallback if
    // no valid size data is included in the bundle.


    }

    ...
}
于 2014-04-08T21:53:05.390 回答
6

因此,文档中提到了 onUpdate():“...[I]如果您声明了配置 Activity,则在用户添加 App Widget 时不会调用此方法,但会在后续更新时调用此方法。” 好吧,显然这也不是真的。onUpdate() 被调用,即使我的小部件有一个配置活动。

无论如何,从 onUpdate() 调用 onAppWidgetOptionsChanged() 似乎是基于 4.2+ 的启动器中的一种解决方法,因为当小部件首次放置在主屏幕上时会调用 onUpdate(),我们可以从 AppWidgetManager 实例中获取 Bundle appWidgetOptions。

@Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]){
      super.onUpdate(context, appWidgetManager, appWidgetIds);
      final int N = appWidgetIds.length;
      for (int i=0; i<N; i++) {
          int appWidgetId = appWidgetIds[i];
          Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
          if(options!=null){
              int nwidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
              int nheight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
              onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, options);
          }
      }
  }
于 2013-08-31T20:22:11.437 回答