2010-06-20 90 views
7

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

我无法找到触发的onRotation()种为的AppWidgetProvider重做在旋转,所以我不是很确定如何进行的事件监听代码...

谢谢!

回答

3

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

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


有对配置变化没有的onUpdate。主屏幕会重新创建您的窗口小部件 ,然后采用最新的RemoteView并将其应用于 窗口小部件。

我觉得它正在重新创建旋转的Widget。问题 是,我似乎没有得到任何消息,并没有办法(我可以看到)重建连接。我如何 确定发生了旋转并建立了新的onClick 连接?

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

你要做的,是确保每一个代码推送RemoteViews 对象进入家庭应用的窗口小部件时,它的完成在所有 方面:

  • 具有图像资源ID;
  • 有文字刺痛;
  • 有未决意图。

不要做“增量”窗口小部件的更新,像你这样一个普通 活动做 - 不先设定意图,然后将图像,然后反映当前信息的文本 。

家庭应用程序作为一个单独的进程运行,其状态可以与您的小部件接收器失步 。当它发生时, 重新创建您的小部件的唯一方法就是您最近的RemoteViews对象。如果它是完整的,并且具有所有部分,则一切都会正常工作。如果它只有 具有最新的文本或图像更改,则具有 意图的较早更新将丢失。

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

- 克斯特亚

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

首先,确保你的RemoteViews是小工具的状态的完整表示,如果你打电话AppWidgetManager.updateAppWidget()。设置所有挂起的意图,查看数据等。当启动器想要从状态恢复你的小部件时,这个状态将被重新使用,例如。当轮换改变时。

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

此更新不同于updateAppWidget(INT,RemoteViews),所述 RemoteViews对象被传递被理解为微件的不完整的 表示,并且因此不被 AppWidgetService缓存。请注意,因为这些更新没有被缓存,所以在使用AppWidgetService中的 缓存版本恢复小部件的情况下,任何 都不会因restoreInstanceState 还原而修改的那些状态保持不变。使用 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);