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

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

我无法找到一个onRotation()类型的触发器的AppWidgetProvider重做侦听代码在旋转的情况下,所以我很不确定如何进行...

谢谢!


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

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


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

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

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

你要做的是确保每次你的代码将一个RemoteViews对象推入你的widget的home应用程序时,它在各方面都是完整的:

  • 有图像资源ID;
  • 有文字刺痛;
  • 有待处理的意图。
  • 不要执行“增量”窗口小部件更新,就像您对常规活动所做的那样 - 不要先设置意图,然后设置图像,然后再反射当前信息。

    家庭应用程序作为一个独立的进程运行,其状态可能与您的小部件接收器失去联系。 当它这样做时,它唯一的用于重新创建你的小部件的是你最近的RemoteViews对象。 如果它是完整的,并具有所有的部分,一切都会工作得很好。 如果它只有最新的文本或图像更改,则具有意图的较早更新将会丢失。

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

    - Kostya


    以下代码似乎能够解决问题。

    @Override
    public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
        super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
        onUpdate(context, appWidgetManager, new int[] {appWidgetId});
    }
    

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

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

    此更新与updateAppWidget(int,RemoteViews)的不同之处在于,传递的RemoteViews对象被理解为该控件的不完整表示,因此不会被AppWidgetService缓存。 请注意,因为这些更新没有被缓存,所以它们修改的任何状态都不会被restoreInstanceState恢复,在使用AppWidgetService中的缓存版本恢复Widget的情况下将不会持续。 使用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);
    
    链接地址: http://www.djcxy.com/p/1437.html

    上一篇: Auto Screen Rotation Disabling Widget RemoteView onClick event

    下一篇: Browser Emulator API for .NET