2010-04-16 51 views
4

我的主屏幕上有一个小部件,其中包含多个具有默认背景图像的ImageButton。通过配置活动,我可以更改任何ImageButton上的图像。问题是当旋转屏幕时,ImageButton上的图像消失并且它变回默认图像。Android小部件ImageButton在旋转屏幕时丢失图像

我不知道为什么会这样或如何解决它

回答

8

当屏幕旋转时,整个appwidget使用您传递给AppWidgetManager .updateAppWidget最后RemoteViews对象()重建。因此,每次调用updateAppWidget()时,都必须传递一个RemoteViews对象,该对象包含所有设置的RemoteViews对象,以便在完成重新构建时控件所需的所有内容,而不仅仅是要在窗口小部件上更新的一两件事情显示。

因此,在您的AppWidgetProvider类中,无论何时更新appwidget,您都需要创建一个RemoteViews对象,使用该对象为您的appwidget构建所有视图设置,然后在调用AppWidgetManager.updateAppWidget()时你完成了。

我的猜测是,你正在做的事情是这样的:

  • 获得RemoteViews对象
  • 设置新的按钮图像
  • 呼叫updateAppWidget()
  • 获取RemoteViews对象
  • 设定等候意图按钮
  • 致电updateAppWidget()

当你需要做这样的事情:

  • 获得RemoteViews对象
  • 设置新的按钮图像
  • 设定等候的意图上的按钮
  • 呼叫updateAppWidget()
+0

这一工程...谢谢! – alejom99 2010-04-16 15:13:09

+0

如果您从两个位置进行更新,该怎么办?又名'OnRecieve'和'OnUpdate' – Doomsknight 2012-09-17 15:51:46

+0

@Doomsknight为什么这会有所作为?只需在两者中正确更新它。我不确定你的问题如何适用于这里提出的原始问题。 – 2012-09-17 17:00:19

1

mbaird的答案是唯一的答案。
但还有另一个解决方案。解决方法是在创建/更新小部件的整个视图时使用updateAppWidget,并且仅在更改视图的一部分时使用partiallyUpdateAppWidget。然后视图不会重置。

部分更新例子(显示在所有小一点点同步图标):

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, Widget.class)); 
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

views.setViewVisibility(R.id.syncImage, View.VISIBLE); 

for (int i = 0; i < appWidgetIds.length; i++) {  
    appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], views); 
}