我在 android 上编写一些 ui 屏幕。有时我需要立即查看 ui 更改,但可以在下一个 ui 线程请求中看到更改。因此,例如,如果我删除屏幕上的一个视图并以编程方式添加另一个视图,然后更改整个视图(使用 viewAnimator),可以观察到删除视图,但不能观察到新视图。我确定添加了新视图,因为当我返回第一页时,新视图出现在屏幕上。
我应该调用哪个函数添加或删除屏幕上的某些视图以立即查看其效果?
我尝试了 invalidate(),但它不适用于我的情况
我在 android 上编写一些 ui 屏幕。有时我需要立即查看 ui 更改,但可以在下一个 ui 线程请求中看到更改。因此,例如,如果我删除屏幕上的一个视图并以编程方式添加另一个视图,然后更改整个视图(使用 viewAnimator),可以观察到删除视图,但不能观察到新视图。我确定添加了新视图,因为当我返回第一页时,新视图出现在屏幕上。
我应该调用哪个函数添加或删除屏幕上的某些视图以立即查看其效果?
我尝试了 invalidate(),但它不适用于我的情况
听起来,如果您说 UI 仅在下一个 UI 线程请求时更新,那么您正在从另一个线程修改 UI 元素。因此,您必须使用 runOnUiThread 在 Runnable 中修改它们。因此,例如:
//example code
//where you are trying to modify UI components, do this instead
runOnUiThread(new Runnable(){
public void run(){
//update UI elements
}
});
确保视图准备就绪后立即对视图进行更改的最佳方法是将 a 添加Runnable
到视图的消息队列中:
view.post(new Runnable(){
@Override
public void run() {
//TODO your code
}
});
在没有可绘制(甚至透明)或没有子视图的视图上的 invalidate() 不会被调用。您必须在 setBackgroundDrawable(Color.Transparent) 所有这些或在开发时添加一个虚拟子视图以观察变化。
另请注意,在 Android 3 + 中,渲染系统发生了变化。当您使父母无效时,孩子并不总是无效。如果您想要与较低版本相同的行为,您应该手动使整个树无效