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

时间:2010-06-20 10:58:17

标签: android android-appwidget

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

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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


  
    

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

  
     

我认为它是在旋转时重新创建Widget。问题   是的,我似乎没有得到任何消息,并且有   没有办法(我可以看到)重新建立连接。我怎么能够   确定已发生旋转并设置新的onClick   连接?

就像我说的那样,你没有(确定或回应方向改变)。

您所做的是确保每次代码都推送RemoteView 对象进入您的小部件的主应用程序,它是完整的 方面:

  • 有图片资源ID;
  • 有文字叮咬;
  • 有未决意图。

不要像常规那样进行“增量”小部件更新 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);