Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 立即应用ui更改_Android_User Interface - Fatal编程技术网

Android 立即应用ui更改

Android 立即应用ui更改,android,user-interface,Android,User Interface,我正在android上编写一些ui屏幕。有时我需要立即查看ui更改,但这些更改可以在下一个ui线程请求中看到。所以,例如,如果我删除屏幕上的一个视图并以编程方式添加另一个视图,然后更改整个视图(使用viewAnimator),则可以观察到删除视图,但无法观察到新视图。我确信添加了新视图,因为当我返回到第一页时,新视图就出现在屏幕上 我应该调用哪个函数在屏幕上添加或删除一些视图以立即查看其效果 我尝试了invalidate(),但它不适用于我的案例invalidate()对于没有可绘制(甚至是Tr

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

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

我尝试了invalidate(),但它不适用于我的案例

invalidate()对于没有可绘制(甚至是Transpare)或没有调用子对象的视图。 您必须在所有视图中添加setBackgroundDrawable(Color.Transparent),或者在开发时添加一个虚拟子视图来观察更改


还请注意,在Android 3+上,渲染系统已更改。使父项无效时,子项并不总是无效。如果您想要与较低版本相同的beahvior,则应手动使整个树无效。如果您说UI仅在下一个UI线程请求时更新,则听起来您是在从另一个线程修改UI元素。因此,必须使用runOnUiThread在可运行状态下修改它们。例如:

//example code
//where you are trying to modify UI components, do this instead
runOnUiThread(new Runnable(){
    public void run(){
        //update UI elements
    }
});

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

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

你能补充一些细节吗?“回到第一页”是什么意思?你正在使用某种形式的AdapterView或ViewPager吗?如果你显示一些代码,它会有所帮助。它根本不起作用。但我认为这是最接近的答案。我用不同的方法解决了我的问题。我的答案有什么意见吗?我认为这是最好的做法,也是最有效的方法。不应该调用invalidate()来更新视图。请参见此处的顶部答案:。“View#invalidate告诉系统在主线程空闲时重新绘制(通过onDraw)视图。”这听起来与Adem所要求的完全相反,Adem要求实时更新UI,而不是等待线程操作。谢谢你的提示,Phil。从未想过将其发布到视图的消息队列中。如果复选框被选中,我会在按钮上设置
isActivated
,但是,即使使用您的代码或其他答案,如果我快速单击复选框,即使复选框被选中,按钮也可能被禁用。