我有一个LinearLayout,当单击它的一个子视图( ImageButton)时,我想更改它的背景颜色。我可以做到这一点,但不是立即--变化不会在屏幕上发生,直到稍后(我认为是在onResume调用期间)。我想知道如何在背景设置完成后,在下一行代码执行之前,强制布局重新绘制。下面是按钮的OnClickListener的onClick方法:
public void onClick(View v) {
LinearLayout parentLayout = (LinearLayout) v.getParent();
parentLayout.setBackgroundResource(R.color.my_color);
SystemClock.sleep(1000); //ms
}
sleep命令用于测试重绘是在重绘之前还是之后发生。结果是: after。关于这个主题的大多数问题(比如here和here)都建议在视图上使用invalidate()。我在后台和休眠行之间使用了命令parentLayout.invalidate();
、parentLayout.postInvalidate();
和parentLayout.refreshDrawableState();
,但都没有用。重绘仍然发生在睡眠命令之后。有人能告诉我如何让它立即发生吗?
其他可能有用的信息: LinearLayout绑定到ListView的行,上面的OnClickListener在扩展SimpleCursorAdapter的自定义类中,而不是在活动本身中。(通过这种方式,我可以为ListView中的每一行设置一个侦听器。)
发布于 2012-01-11 15:32:16
好了,我终于找到了这个问题的解决方案,而且很简单。问题似乎只是我在OnClickLIstener中执行可绘制的更改,而我本应该在OnTouchListener中执行它。如果我为查找ACTION_DOWN的按钮设置了一个OnTouchListener,然后在其父布局上运行setBackgroundColor,则更改会立即生效。
另一种不太健壮的解决方案来自this post。您可以在xml中为父布局背景分配一个选择器,然后在上面提到的OnTouchListener中,对该布局运行setPressed(true)。这不是一个很好的解决方案,因为与直接在代码中更改视图的属性相比,选择器给您的自由度要少得多。例如,您不能通过按下不同的按钮来将布局背景设置为不同的颜色。
感谢那些在这方面提供建议的人!
发布于 2012-01-06 16:46:46
您可以在之后立即调用draw(canvas)
来尝试forceLayout()
。如果未覆盖onLayout()
、onMeasure
、draw()
或onDraw()
,则将运行默认实现。这样做的唯一问题是,您必须获取画布或手动创建一个画布。
强烈建议不要采用这种方法,因为Android是专门为避免在正常更新之外绘制而设计的。虽然您正确地认为invalidate()
不会立即发生,但这是鼓励重绘的最安全和最好的方法。如果你想在更新之外处理绘图,Android提供了一种通过SurfaceHolder类来实现的方法。
发布于 2012-01-06 15:30:06
进行更改并调用listview.invalidate();以在UI上反映这些更改
https://stackoverflow.com/questions/8754709
复制相似问题