Android: как установить кнопку отключения сразу после метода setEnabled (false)? - PullRequest
1 голос
/ 08 ноября 2011

Этот вопрос не только предел для Баттона или этого сеттера.Например, здесь слушатель кнопки:

runButton.setOnClickListener(new View.OnClickListener() {

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

Когда эта кнопка нажата, я хочу, чтобы она была немедленно отключена.Однако практически я вижу, что эта кнопка не будет отключена до тех пор, пока все методы не будут завершены, то есть после завершения метода runScript () кнопка фактически станет серой.Так, может кто-нибудь сказать мне, как отключить кнопку сразу после этой строки?

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Что происходит, метод runScript блокирует поток пользовательского интерфейса. Внутри вашего onClick метода вы хотите отключить кнопку и запустить скрипт в другом потоке, например,

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

Более подробная информация найдена здесь:

0 голосов
/ 08 ноября 2011

Попробуйте вызвать runButton.invalidate () сразу после метода setEnabled (false)

Также

У вас не должно быть долго работающих методов в потоке пользовательского интерфейса, которые передают 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

0 голосов
/ 08 ноября 2011

Как общее практическое правило, вы должны избегать любых действий, которые могут занять много времени в потоке пользовательского интерфейса. В прослушивателе кликов вы можете создать новый поток, который выполняет длительный метод в фоновом режиме. Класс android AsyncTask предоставляет множество методов поддержки фоновых потоков, которые могут отправлять обновления обратно в пользовательский интерфейс с помощью событий прогресса.

...