【发布时间】:2015-05-31 09:43:27
【问题描述】:
我有一个包含主要活动和应用小部件的应用。每当屏幕方向发生变化时,应用小部件都需要更新(它会计算其位图大小,这取决于当前方向)。
如何使小部件在方向更改时更新?我找到了 ACTION_CONFIGURATION_CHANGED 事件,但不确定如何使用它,因为文档说它无法在清单中注册。
如果有帮助,我已经有一个可以在午夜更新小部件的 BroadcastReciever。
【问题讨论】:
我有一个包含主要活动和应用小部件的应用。每当屏幕方向发生变化时,应用小部件都需要更新(它会计算其位图大小,这取决于当前方向)。
如何使小部件在方向更改时更新?我找到了 ACTION_CONFIGURATION_CHANGED 事件,但不确定如何使用它,因为文档说它无法在清单中注册。
如果有帮助,我已经有一个可以在午夜更新小部件的 BroadcastReciever。
【问题讨论】:
回答我自己的问题。正确的方法不是检测方向变化(家庭启动器可能使用也可能不使用),而是拥有一个自动适应方向变化的小部件。有时它是微不足道的,有时它不是。以我为例,我需要显示一张横向位图和一张纵向位图。通过拥有两个 ImageView 解决了这个问题,一个是纵向启用(通过样式资源),另一个是横向启用。在 AppWidgetProvider 中,我填充了两个图像(在我的例子中是文件 URI)并让启动器选择它需要的方向。
了解设备方向更改后,小部件容器重新创建布局(应用正常资源选择规则)并在该布局上重放 RemoteViews 命令非常重要。
【讨论】:
解决方案是使用onReceive() 方法调用onUpdate()。这是我的代码:
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
String action = intent.getAction();
Toast.makeText(context, action, Toast.LENGTH_LONG).show();
if (action.equals(action)) {
Bundle extras = intent.getExtras();
if (extras!=null) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), WidNameWidgetActivity.class.getName());
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
onUpdate(context, appWidgetManager, appWidgetIds);
}
}
}
【讨论】:
extras,但从不使用它。