7

我编写的小部件有一个奇怪的错误——屏幕旋转后,小部件停止响应 onClick 事件。该代码与此处的 App Widgets 的 Android 开发人员文档中的代码完全相同。我注意到市场上的其他小部件没有这个问题 - 是否有已知的解决方法?我试过在旋转后到处敲击,所以我不认为它的 onClickPendingIntent 在旋转后没有被调整大小;它似乎根本不存在。

我找不到 onRotation() 类型的触发器让 AppWidgetProvider 在发生旋转时重做监听代码,所以我很不确定如何继续......

谢谢!

4

3 回答 3

3

我在 Google 网上论坛上发表的帖子中收到了以下回复,该帖子解决了我的问题。我不能说它是否会解决原始海报的问题,但我会发布它,以防其他人遇到这个问题。我的 Google Groups 帖子的链接是:

http://groups.google.com/group/android-developers/browse_thread/thread/ca8c2958b6dc086c#


配置更改没有 onUpdate。主屏幕重新创建您的小部件,然后获取最新的 RemoteViews 并将其应用于小部件。

我认为它正在重新创建旋转的小部件。问题是,我似乎没有收到任何消息,并且没有办法(我可以看到)重新建立连接。如何确定已发生旋转并设置新的 onClick 连接?

就像我说的,你不(确定或响应方向变化)。

您所做的是确保每次您的代码将 RemoteViews 对象推送到您的小部件的主应用程序中时,它在所有方面都是完整的:

  • 具有图像资源 ID;
  • 有文字刺痛;
  • 有待处理的意图。

不要像常规活动那样进行“增量”小部件更新 - 不要先设置意图,然后是图像,然后是反映当前信息的文本。

主应用程序作为一个单独的进程运行,其状态可能与您的小部件接收器不同步。当它这样做时,它唯一用于重新创建您的小部件的就是您最近的 RemoteViews 对象。如果它是完整的,并且具有所有部件,那么一切都会正常工作。如果它仅具有最近的文本或图像更改,则具有意图的较早更新将丢失。

http://kmansoft.wordpress.com/2010/05/23/widgets-and-orientation-chan ...

——科斯蒂亚

于 2011-01-14T17:02:28.580 回答
1

首先,确保您的 RemoteViews 是小部件状态的完整表示,如果您正在调用AppWidgetManager.updateAppWidget(). 设置所有待处理的意图,查看数据等。当启动器想要从状态恢复您的小部件时,将重新使用此状态,例如。当旋转发生变化时。

当您想更新远程视图但又不想提供完整的 RemoteViews 表示时,即。您只想更改现有的 remoteView 状态,您可以使用AppWidgetManager.partiallyUpdateAppWidget().

此更新与 updateAppWidget(int, RemoteViews) 的不同之处在于,传递的 RemoteViews 对象被理解为小部件的不完整表示,因此不会被 AppWidgetService 缓存。请注意,由于这些更新未缓存,因此在使用 AppWidgetService 中的缓存版本恢复小部件的情况下,它们修改的任何未由 restoreInstanceState 恢复的状态都不会持续存在。与 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);
于 2016-06-15T22:11:30.693 回答
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});
}
于 2014-10-27T23:36:07.703 回答