自动屏幕旋转禁用小部件RemoteView的onClick事件

7
我有一个奇怪的错误,与我编写的小部件有关-在屏幕旋转后,该小部件停止响应onClick事件。 代码与Android开发人员文档中的App小部件(位于此处)完全相同。 我注意到市场上的其他小部件没有这个问题,也许有已知的解决方法吗? 我试图在旋转后敲击各种地方,所以我不认为它是onClickPendingIntent在旋转后未被调整大小,因为它根本不存在。

我找不到AppWidgetProvider的onRotation()类型触发器,以在旋转事件发生时重新执行监听代码,因此我不太确定如何继续...

谢谢!

3个回答

3
我在Google Groups上发布了一篇文章,收到了以下回复,解决了我的问题。我不确定它是否能解决原帖作者的问题,但我想发布它以便其他人遇到这个问题时可以参考。我的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...

-- Kostya


1
首先,如果您正在调用AppWidgetManager.updateAppWidget(),请确保您的RemoteViews是小部件状态的完整表示。设置所有挂起的意图、视图数据等。这个状态将在启动器想要从状态中恢复您的小部件时被重用,例如当旋转改变时。
当您想要更新您的remote views,但不想提供完整的RemoteViews表示,即您只想改变现有的remoteView状态时,可以使用AppWidgetManager.partiallyUpdateAppWidget()
引用:

这种更新与updateAppWidget(int, RemoteViews)的区别在于,传递的RemoteViews对象被理解为小部件的不完整表示,因此不会被AppWidgetService缓存。注意,由于这些更新不被缓存,任何它们修改的状态如果没有通过restoreInstanceState恢复,则在使用AppWidgetService中缓存的版本恢复小部件的情况下不会持久存在。与RemoteViews.showNext(int)、RemoteViews.showPrevious(int)、RemoteViews.setScrollPosition(int, int)和类似命令一起使用。

例如,在更新ViewPager以用于onUpdate之外的小部件时:
final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget_4x2);
remoteViews.showNext(R.id.appWidget_viewFlipper);
appWidgetManager.partiallyUpdateAppWidget(widgetId, remoteViews);

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});
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接