根据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!为什么股票发射器不起作用?其他人有这个问题吗?
答案 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);
}
}
}