如何在执行下一行代码之前强制视图重绘

pva*_*ans 21 android redraw

我有一个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

}
Run Code Online (Sandbox Code Playgroud)

sleep命令在那里测试重绘是在它之前还是之后发生.结果:之后.关于这个主题的大多数问题(比如这里这里)都说在视图上使用invalidate().我已经使用过的命令parentLayout.invalidate();,parentLayout.postInvalidate();以及parentLayout.refreshDrawableState();在后台和睡眠线之间,都无济于事.重写仍然发生在sleep命令之后.任何人都可以告诉我如何立即实现它吗?

其他可能有用的信息:LinearLayout绑定到ListView的行,上面的OnClickListener位于扩展SimpleCursorAdapter的自定义类中,而不是活动本身.(这样我就可以为ListView中的每一行设置一个监听器.)

pva*_*ans 2

好吧,我终于找到了解决这个问题的方法,而且很简单。问题似乎只是我在 OnClickLIstener 中执行可绘制更改,而我应该在 OnTouchListener 中执行此操作。如果我为按钮设置一个 OnTouchListener 来查找 ACTION_DOWN,然后在其父布局上运行 setBackgroundColor,则更改会立即发生。

这篇文章提供了另一种不太健壮的解决方案。您可以在 xml 中为父布局背景分配一个选择器,然后在上面提到的 OnTouchListener 中,在该布局上运行 setPressed(true) 。这不是一个很好的解决方案,因为选择器为您提供的自由度比直接在代码中更改视图属性要少得多。例如,您无法通过按不同的按钮将布局背景设置为不同的颜色。

感谢那些对此提供帮助的建议!