我找不到AppWidgetProvider的onRotation()类型触发器,以在旋转事件发生时重新执行监听代码,因此我不太确定如何继续...
谢谢!
我找不到AppWidgetProvider的onRotation()类型触发器,以在旋转事件发生时重新执行监听代码,因此我不太确定如何继续...
谢谢!
配置更改没有onUpdate。主屏幕会重新创建小部件,然后将最新的RemoteViews应用于小部件。
我认为它在旋转时重新创建了小部件。问题是,我似乎没有收到任何相关消息,并且没有办法(至少我看不到)重新建立连接。如何确定已发生旋转并设置新的onClick连接?
就像我说的那样,您无法确定或响应方向更改。
您需要确保每次代码将RemoteViews对象推送到主页应用程序以供小部件使用时,该对象在各个方面都是完整的:
不要进行“增量”小部件更新,就像您对常规活动所做的那样-不要首先设置意图,然后设置反映当前信息的图像和文本。
主页应用程序作为单独的进程运行,其状态可能与您的小部件接收器的状态不同步。当它这样做时,它重新创建您的小部件所拥有的仅为最新的RemoteViews对象。如果它是完整的并且具有所有部分,则一切都将正常工作。如果它仅具有最新的文本或图像更改,则具有意图的较早更新将丢失。
http://kmansoft.wordpress.com/2010/05/23/widgets-and-orientation-chan...
-- Kostya
AppWidgetManager.updateAppWidget()
,请确保您的RemoteViews是小部件状态的完整表示。设置所有挂起的意图、视图数据等。这个状态将在启动器想要从状态中恢复您的小部件时被重用,例如当旋转改变时。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);
以下代码似乎能够解决这个问题。
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
onUpdate(context, appWidgetManager, new int[] {appWidgetId});
}