Android:在视图上更改后台选择器资源不会更新

时间:2014-08-08 05:11:30

标签: android

问题似乎很简单,我在Android源代码中挖掘出来但问题的原因并不明显。

实际上,这就是我正在做的事情

if(condition) {
    view.setBackgroundResource(R.drawable.selector1);
}else {
    view.setBackgroundResource(R.drawable.selector2);
}

视图不在列表中,但会重复使用。如果我在点击事件期间进行此更改并且我在我的选择器资源中定义了enterFadeDurationexitFadeDuration,那么将呈现相应的drawable(我假设动画强制重绘)。但是,如果我在隐藏视图时进行此更改,然后将visiblity设置为visible,则不会绘制更新的选择器。随后,如果我按下视图,则会正确呈现选择器。

我的猜测是Android优化阻止了后台资源的更新。在设置新的背景选择器后,我尝试了invalidate()requestLayout()等显而易见的选项。有没有其他方法可以强制视图使用新的背景选择器进行更新?

注意:仅在KitKat(4.4.4)上进行了测试

2 个答案:

答案 0 :(得分:1)

您可能无法通过UI线程更改背景。试试这个:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        if (condition) {
            view.setBackgroundResource(R.drawable.selector1);
        } else {
            view.setBackgroundResource(R.drawable.selector2);
        }
    }
});

答案 1 :(得分:1)

正如Rod_Algonquin指出的那样,我应该展示更多代码。当我创建一个示例项目来重现这个问题时,我发现了这个问题。我将在下面描述我的解决方案以供参考。

我暂时禁用了更新选择器的视图。当我启用视图时,似乎选择器正在寻找state_enabled="true"项。没有这个,就不会应用选择器。我曾希望/预期会选择默认选择器项,但添加了state_enabled选择器项条目后,视图会按预期更新。