我对我编码的小部件有一点奇怪的错误 - 在屏幕旋转后,小部件停止响应onClick事件。该代码与App Widgets here的Android开发人员文档中的代码完全相同。我注意到市场上的其他小部件没有这个问题 - 是否有一个已知的解决方法?我已经尝试在旋转后遍布整个地方,所以我不认为它的onClickPendingIntent在旋转后没有被调整大小;它似乎根本不存在。
我无法找到一个onRotation()类型的触发器,AppWidgetProvider会在旋转时重做监听代码,所以我很不确定如何继续......
谢谢!
答案 0 :(得分:3)
我在Google网上论坛发布的帖子中收到了以下回复,该帖子解决了我的问题。我不知道它是否会解决原始海报的问题,但我会发布它,以防其他人遇到这个问题。我的Google网上论坛帖子的链接是:
http://groups.google.com/group/android-developers/browse_thread/thread/ca8c2958b6dc086c#
配置更改没有onUpdate。主屏幕重新创建 你的小部件,然后采取最新的RemoteViews并将其应用于 窗口小部件。
我认为它是在旋转时重新创建Widget。问题 是的,我似乎没有得到任何消息,并且有 没有办法(我可以看到)重新建立连接。我怎么能够 确定已发生旋转并设置新的onClick 连接?
就像我说的那样,你没有(确定或回应方向改变)。
您所做的是确保每次代码都推送RemoteView 对象进入您的小部件的主应用程序,它是完整的 方面:
不要像常规那样进行“增量”小部件更新 activity - 不先设置意图,然后设置图像,再设置文本 反映当前的信息。
家庭应用程序作为一个单独的进程运行,其状态可能失控 与您的小部件接收器。什么时候,它唯一的东西 重新创建窗口小部件是最新的RemoteViews对象。如果它是 完成,并拥有所有部件,一切都会正常工作。如果只是 有最新的文本或图像更改,早期的更新有 意图将会丢失。
http://kmansoft.wordpress.com/2010/05/23/widgets-and-orientation-chan ...
- 克斯特亚
答案 1 :(得分:0)
以下代码似乎能够解决问题。
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
onUpdate(context, appWidgetManager, new int[] {appWidgetId});
}
答案 2 :(得分:0)
首先,如果您正在调用AppWidgetManager.updateAppWidget()
,请确保您的RemoteViews是窗口小部件状态的完整表示。设置所有挂起的意图,查看数据等。当启动程序想要从状态恢复窗口小部件时,将重新使用此状态,例如。当旋转发生变化时。
当您想要更新远程视图但又不想提供完整的RemoteViews表示时,即。您只想更改现有的remoteView状态,可以使用AppWidgetManager.partiallyUpdateAppWidget()
。
此更新与updateAppWidget(int,RemoteViews)的不同之处在于 传递的RemoteViews对象被理解为不完整 窗口小部件的表示,因此不会被缓存 AppWidgetService。请注意,因为这些更新不是缓存的,所以 声明他们修改了restoreInstanceState没有恢复的状态 在使用the恢复小部件的情况下不会持久存在 AppWidgetService中的缓存版本。使用 RemoteViews.showNext(int),RemoteViews.showPrevious(int), RemoteViews.setScrollPosition(int,int)和类似的命令。
例如,在onUpdate之外的窗口小部件推进ViewPager时:
final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget_4x2);
remoteViews.showNext(R.id.appWidget_viewFlipper);
appWidgetManager.partiallyUpdateAppWidget(widgetId, remoteViews);