这个问题不仅限于Button或这个setter。 例如,这里是一个按钮监听器:
runButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
runButton.setEnabled(false);
runScript();//This function will take a long time!!
}
});
单击此按钮时,我希望立即禁用此按钮。但是,实际上,我看到在完成所有方法之前,此按钮不会被禁用,也就是说,在runScript()方法完成后,按钮实际上变为灰色。 那么,有人能告诉我如何在该行之后立即禁用该按钮吗?
答案 0 :(得分:2)
runScript
方法阻止UI线程会发生什么。你想在onClick
方法中做什么是禁用按钮,然后在不同的线程中运行脚本,如此
runButton.setEnabled(false);
new Thread(new Runnable() {
@Override
public void run() {
runScript();//This function will take a long time!!
}
}).start();
更多信息请点击此处:
答案 1 :(得分:0)
作为一般经验法则,您希望避免在UI线程上做任何可能需要很长时间的事情。您在点击侦听器中可以执行的操作是生成一个新线程,该线程在后台执行长时间运行的方法。 android AsyncTask类为后台线程提供了许多支持方法,可以通过进度事件将更新发送回UI。
答案 2 :(得分:0)
尝试在setEnabled(false)方法后立即调用runButton.invalidate()
另外
您不应该在UI线程传输runScript()中将长时间运行的方法转换为异步任务。按钮状态将更快地更新
runButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
runButton.setEnabled(false);
MyTask asyncTask = new MyTask();
asyncTask.execute();
}
});
private class MyTask extends AsyncTask<void, void, String> {
protected String doInBackground(void) {
runScripts();
//set to something relevant to your app
String result ="";
return result;
}
protected void onPostExecute(String result) {
//do something
}
}
我