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

发布于 2024-12-14 08:34:22 字数 432 浏览 1 评论 0原文

这个问题不仅是对 Button 或这个 setter 的限制。 例如,这里有一个按钮侦听器:

runButton.setOnClickListener(new View.OnClickListener() {

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

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

This question is not only limit for Button or this setter.
For example, here a button listener:

runButton.setOnClickListener(new View.OnClickListener() {

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

When this button is clicked, I want it be disabled immediately. However, practically, I see this button won't get disabled until all the methods finished, that is after the method runScript() finishes, the button actually turns grey.
So, could anyone tell me how to make the button disabled right after that line?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

雪化雨蝶 2024-12-21 08:34:22

发生的情况是 runScript 方法阻塞了 UI 线程。您想要在 onClick 方法中执行的操作是禁用按钮,然后在不同的线程中运行脚本,如下所示

runButton.setEnabled(false);
new Thread(new Runnable() {
    @Override
    public void run() {
            runScript();//This function will take a long time!! 
    }
}).start();

更多信息可在此处找到:

What happens is the runScript method blocks the UI thread. What you want to do inside your onClick method is disable the button then run the script in a different thread, like so

runButton.setEnabled(false);
new Thread(new Runnable() {
    @Override
    public void run() {
            runScript();//This function will take a long time!! 
    }
}).start();

More information found here:

青瓷清茶倾城歌 2024-12-21 08:34:22

作为一般经验法则,您希望避免在 UI 线程上执行任何可能需要很长时间的操作。您可以在单击侦听器中执行的操作是生成一个新线程,该线程在后台执行长时间运行的方法。 android AsyncTask 类提供了很多支持方法来让后台线程可以通过进度事件将更新发送回 UI。

As a general rule of thumb, you want to avoid doing anything that may take a long time on the UI thread. What you can do in your click listener is spawn a new thread that does the long-running method in the background. The android AsyncTask class provides a lot of support methods for having background threads that can send updates back to the UI via progress events.

凉墨 2024-12-21 08:34:22

尝试在 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
 }

}

I

Try calling runButton.invalidate() immediately after setEnabled(false) method

Also

You should not have long running methods in the UI thread transfer runScript() to an asynch task. Button state will get updated faster

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
 }

}

I

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文