Android小部件ImageButton在屏幕旋转时丢失图像

4

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

我不知道为什么会发生这种情况,也不知道如何解决它。

2个回答

10
当屏幕旋转时,整个appwidget都会使用你传递给AppWidgetManager.updateAppWidget()的最后一个RemoteViews对象进行重建。因此,每次调用updateAppWidget()时,非常重要的是,你需要传递一个RemoteViews对象,该对象在完全重建小部件时具有所有必需的设置,而不仅仅是你想要更新的一两个小部件显示内容。
因此,在你的AppWidgetProvider类中,每当你更新小部件时,你需要创建一个RemoteViews对象,使用该对象构建所有小部件的视图设置,然后在完成后调用一次AppWidgetManager.updateAppWidget()。
我猜你正在做这样的事情:
  • 获取RemoteViews对象
  • 设置新的按钮图像
  • 调用updateAppWidget()
  • 获取RemoteViews对象
  • 在按钮上设置挂起意图
  • 调用updateAppWidget()
但你应该这样做:
  • 获取RemoteViews对象
  • 设置新的按钮图像
  • 在按钮上设置挂起意图
  • 调用updateAppWidget()

如果您正在从两个位置进行更新,即“OnReceive”和“OnUpdate”,该怎么办? - IAmGroot
@Doomsknight,那有什么区别吗?只需在两个地方正确更新即可。我不确定你的问题如何与此处提出的原始问题相关。 - Mark B
因为我有两个不同的RemoteView更新。一个更新一半,另一个更新另外一半。如果在最后一个RemoteView上刷新,那么它只会恢复50%的数据。 - IAmGroot
@Doomsknight 我认为你需要提出一个单独的问题,并附上一些示例代码。我不明白你在说什么。 - Mark B

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接