AppWidgetProvider:未在窗口小部件放置上调用onAppWidgetOptionsChanged

时间:2013-08-30 06:55:41

标签: android android-widget appwidgetprovider

根据AppWidgetProvider中onAppWidgetOptionsChanged的文档: “首次放置窗口小部件时以及每次调整窗口小部件时都会调用此窗口。”

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

我有什么遗失的吗?

编辑:我发现的唯一一个启动程序,使得此方法正常运行,如Google文档所述,是Action Launcher Pro;干得好,谢谢,Chris Lacy!为什么股票发射器不起作用?其他人有这个问题吗?

2 个答案:

答案 0 :(得分:7)

感谢您提请注意此问题。我将更新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.


    }

    ...
}

答案 1 :(得分:6)

因此,文档说明onUpdate():“... [我]你已经声明了一个配置Activity,当用户添加App Widget时,不会调用此方法,但是后续更新会调用此方法。” 好吧,显然这也不是真的。调用onUpdate(),即使我为我的小部件配置了一个Activity。

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

@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);
          }
      }
  }