Android:如何在方法setEnabled(false)之后设置按钮禁用?

时间:2011-11-08 18:41:30

标签: android button attributes widget setter

这个问题不仅限于Button或这个setter。 例如,这里是一个按钮监听器:

runButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                runButton.setEnabled(false);
                runScript();//This function will take a long time!! 
            }
        });

单击此按钮时,我希望立即禁用此按钮。但是,实际上,我看到在完成所有方法之前,此按钮不会被禁用,也就是说,在runScript()方法完成后,按钮实际上变为灰色。 那么,有人能告诉我如何在该行之后立即禁用该按钮吗?

3 个答案:

答案 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
 }

}