首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在执行下一行代码之前立即强制视图重绘

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

Stack Overflow用户
提问于 2012-01-06 15:27:06
回答 3查看 34.4K关注 0票数 22

我有一个LinearLayout,当单击它的一个子视图( ImageButton)时,我想更改它的背景颜色。我可以做到这一点,但不是立即--变化不会在屏幕上发生,直到稍后(我认为是在onResume调用期间)。我想知道如何在背景设置完成后,在下一行代码执行之前,强制布局重新绘制。下面是按钮的OnClickListener的onClick方法:

代码语言:javascript
复制
public void onClick(View v) {

  LinearLayout parentLayout = (LinearLayout) v.getParent();
  parentLayout.setBackgroundResource(R.color.my_color);
  SystemClock.sleep(1000); //ms

}

sleep命令用于测试重绘是在重绘之前还是之后发生。结果是: after。关于这个主题的大多数问题(比如herehere)都建议在视图上使用invalidate()。我在后台和休眠行之间使用了命令parentLayout.invalidate();parentLayout.postInvalidate();parentLayout.refreshDrawableState();,但都没有用。重绘仍然发生在睡眠命令之后。有人能告诉我如何让它立即发生吗?

其他可能有用的信息: LinearLayout绑定到ListView的行,上面的OnClickListener在扩展SimpleCursorAdapter的自定义类中,而不是在活动本身中。(通过这种方式,我可以为ListView中的每一行设置一个侦听器。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-11 15:32:16

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

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

感谢那些在这方面提供建议的人!

票数 2
EN

Stack Overflow用户

发布于 2012-01-06 16:46:46

您可以在之后立即调用draw(canvas)来尝试forceLayout()。如果未覆盖onLayout()onMeasuredraw()onDraw(),则将运行默认实现。这样做的唯一问题是,您必须获取画布或手动创建一个画布。

强烈建议不要采用这种方法,因为Android是专门为避免在正常更新之外绘制而设计的。虽然您正确地认为invalidate()不会立即发生,但这是鼓励重绘的最安全和最好的方法。如果你想在更新之外处理绘图,Android提供了一种通过SurfaceHolder类来实现的方法。

票数 3
EN

Stack Overflow用户

发布于 2012-01-06 15:30:06

进行更改并调用listview.invalidate();以在UI上反映这些更改

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8754709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档