我在appwidget中创建了一个功能,允许用户将背景从透明变为半透明。 xml中的默认值设置为透明。当用户更改背景首选项时,将保存设置并使用以下代码更新背景:
public static Bitmap setBackground (int bgcolor)
{
{
Bitmap.Config config=Bitmap.Config.ARGB_8888;
Bitmap bitmap=Bitmap.createBitmap(2, 2, config);
Canvas canvas=new Canvas(bitmap);
canvas.drawColor(bgcolor);
return bitmap;
}
}
/* set background */
if (ExampleWidgetProvider.background==1)
views.setImageViewBitmap(R.id.bgcolor, setBackground(Color.parseColor("#aaaaaaaa")));
else
views.setImageViewBitmap(R.id.bgcolor, setBackground(Color.parseColor("#00000000")));
一位用户报告说,当他将背景设置为半透明时,背景会变回透明状态。这可能在一小时或半天的几分钟内发生似乎是随机的。
我意识到这是背景问题,而不是某种偏好重置,因为我向用户发送了一个appwidget版本,它总是将背景改为半透明,即使用:
/* set background */
if (ExampleWidgetProvider.background==1)
views.setImageViewBitmap(R.id.bgcolor, setBackground(Color.parseColor("#aaaaaaaa")));
else
views.setImageViewBitmap(R.id.bgcolor, setBackground(Color.parseColor("#aaaaaaaa")));
但有趣的是,没有解决它。 由于xml中的默认设置为透明,我怀疑应用程序无论如何重新启动或重绘并且正在使用默认布局。
如何检测和/或解决此问题?
更新:用户(按预期方式)确认修复,将xml中的背景颜色永久更改为半透明工作正常。这意味着系统正在重置背景,原因不明。
用户使用的是LG PG 970 V. 2.2.2以及他使用“Juice Defender Ultimate”的价值,并将其配置为在夜间不连接到互联网。我的appwidget确实定期连接到互联网。
答案 0 :(得分:0)
好吧,我实际上找到了重现它的方法。我有一个带滑出式键盘的LG,当你滑出键盘时可以旋转主屏幕。一旦它这样做,半透明背景就会消失。看起来我必须检测某种重绘事件。
我找到了一个解决方案,但并不完全确定。无论哪种方式,它解决了这个问题,至少当我用上面提到的再现方法进行测试时。
我实现了一个永久运行的服务,它覆盖了onConfigurationChanged()方法。
有关想法,请参阅:
您无法通过清单
中声明的组件收到此信息
这为活动提供了解决方案,但我不确定如何在appwidgets中使用类似的东西,如果可能的话:
代码示例,此服务在onEnabled()方法的AppWidgetProvider类中启动。所以它只运行一次,无论你的appwidget运行了多少个实例,理想情况下应该能够处理任何实例。
public class ExampleConfigChangeService extends Service
{
@Override
public void onCreate()
{
super.onCreate();
/* whatever code you need here */
}
@Override
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
/* whatever code you need here */
}
/* you need this or it will not compile **/
@Override
public IBinder onBind(Intent intent)
{
/* We don't need to bind to this service */
return null;
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
/*
* this is the code that will run whenever an ACTION_CONFIGURATION_CHANGED happens
* do whatever needs to be done, such as re-reading preferences,
* resetting background to user's preferred setting etc.
*/
}
}