【问题标题】:apply ui changes immediately立即应用 ui 更改
【发布时间】:2012-09-26 07:52:44
【问题描述】:

我在 android 上编写一些 ui 屏幕。有时我需要立即查看 ui 更改,但可以在下一个 ui 线程请求中看到更改。因此,例如,如果我删除屏幕上的一个视图并以编程方式添加另一个视图,然后更改整个视图(使用 viewAnimator),可以观察到删除视图,但不能观察到新视图。我确定添加了新视图,因为当我返回第一页时,屏幕上出现了新视图。

我应该调用哪个函数添加或删除屏幕上的某些视图以立即查看其效果?

我尝试了 invalidate(),但它不适用于我的情况

【问题讨论】:

  • 你能补充一些细节吗? “回到第一页”是什么意思?您使用的是某种形式的 AdapterView 还是 ViewPager?
  • 如果你显示一些代码,它会有所帮助..

标签: android user-interface


【解决方案1】:

听起来,如果您说 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
    }
});

【讨论】:

    【解决方案2】:

    确保在视图准备就绪后立即对视图进行更改的最佳方法是将Runnable 添加到视图的消息队列中:

    view.post(new Runnable(){
        @Override
        public void run() {
            //TODO your code
        }
    });
    

    【讨论】:

    • 感谢您的提示,菲尔。从未想过将其发布到视图的消息队列中。
    • 如果复选框被选中,我将在按钮上设置isActivated,但即使使用您的代码或其他答案,如果我快速单击复选框,即使复选框被选中。
    【解决方案3】:

    invalidate() 在没有可绘制(甚至透明)或没有子视图的视图上不会被调用。 你必须在 setBackgroundDrawable(Color.Transparent) 对所有这些或在开发时添加一个虚拟子视图来观察变化。

    另外请注意,在 Android 3 + 中,渲染系统发生了变化。当您使父母无效时,孩子并不总是无效。如果您想要与较低版本相同的行为,则应该手动使整个树无效

    【讨论】:

    • 它根本不起作用。但这是我认为最接近的答案。我以不同的方式解决了我的问题
    • 对我的回答有任何意见吗?我认为这是最好的做法,也是最有效的做事方式。
    • invalidate() 不应被称为更新视图的方法。在此处查看最佳答案:stackoverflow.com/questions/1458047/…。 “View#invalidate 告诉系统在主线程空闲后立即重绘(通过 onDraw)视图。”这听起来与 Adem 所要求的完全相反,后者是 UI 的实时更新,而不是等待线程操作。
    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2020-08-09
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多