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

Eri*_*ran 3 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!为什么股票发射器不起作用?其他人有这个问题吗?

小智 7

感谢您提请注意这个问题.我将更新Android文档以反映这一点.

然而,而不是强迫到onAppWidgetOptionsChanged()中的onUpdate()的调用,我们建议的方法,如以下几点:

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.


    }

    ...
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ran 6

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

无论如何,从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);
          }
      }
  }
Run Code Online (Sandbox Code Playgroud)