Отключить кнопки во время AsyncTask - PullRequest
3 голосов
/ 21 февраля 2012

Я запрограммировал приложение-викторину, и если я касаюсь одного из ответов в AsyncTask, если ответ правильный, я устанавливаю цвет на зеленый или если он ложный на красный.

Но теперь во время работы AsyncTask я могу нажимать другие кнопки, такие как кнопка «изменить вопрос» или другой ответ. Затем это делается после того, как AsyncTask завершил свою работу. Таким образом, следующий вопрос загружается, и он автоматически отвечает на следующий вопрос или использует один из джокеров.

Я пытался установитьEnabled (false) для кнопок, но они по-прежнему глючат.

Как мне предотвратить это?

private void disableOrDisableButtons(boolean boo) {
        buttonAnswer1.setEnabled(boo);
        buttonAnswer2.setEnabled(boo);
        buttonAnswer3.setEnabled(boo);
        buttonAnswer4.setEnabled(boo);
    }

и вот я запускаю AsyncTask

disableOrDisableButtons(false);
new PrepareAdapter().execute(null, null, null);

в моей AsyncTask

@Override
        protected void onPreExecute() {
            disableOrDisableButtons(false);
            if (correctAnswerAtButton != buttonClicked) {
                switch (buttonClicked) {
                case 1:
                    buttonAnswer1.setTextColor(Color.RED);
                    break;
                case 2:
                    buttonAnswer2.setTextColor(Color.RED);
                    break;
                case 3:
                    buttonAnswer3.setTextColor(Color.RED);
                    break;
                case 4:
                    buttonAnswer4.setTextColor(Color.RED);
                    break;
                }
                if (buttonClicked != 0) { // 0.. if second chance joker used
                    wrongAnswer = true;
                }
            }
            switch (correctAnswerAtButton) {
            case 1:
                buttonAnswer1.setTextColor(Color.GREEN);
                return;
            case 2:
                buttonAnswer2.setTextColor(Color.GREEN);
                return;
            case 3:
                buttonAnswer3.setTextColor(Color.GREEN);
                return;
            case 4:
                buttonAnswer4.setTextColor(Color.GREEN);
                return;
            }
        }

Ответы [ 4 ]

1 голос
/ 21 февраля 2012

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

public abstract class BaseAsyncTask<Param, Result> extends AsyncTask<Param, Void, Result> implements DialogInterface.OnCancelListener {
    private static final String TAG = "BaseAsyncTask";
    private ProgressDialog dialog = null;
    protected Context ctx = null;
    protected Exception exception = null;

    public BaseAsyncTask(Context ctx) {
        this.ctx = ctx;
    }

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(ctx, WLConstants.MSG_TITLE_LOADING_DIALOG, WLConstants.MSG_LOADING_DIALOG, true);
        dialog.setCancelable(true);
        dialog.setOnCancelListener(this);
        if (ctx instanceof WozzonActivity) {
            ((WozzonActivity) ctx).setCurrentDialog(dialog);
        }
    }

    @Override
    protected Result doInBackground(Param... parameters) {
        try {
            return inBackground(parameters);
        } catch (Exception ex) {
            exception = ex;
            Log.e(TAG, ex.getClass().getName(), ex);
            return null;
        }
    };

    @Override
    protected void onPostExecute(Result result) {
        try {
            dialog.dismiss();
        } catch (Exception ex) {
        }// TODO:
        if (result == null) {
            onException(exception);
        } else {
            onResult(result);
        }
    }

    protected void onException(Exception ex) {
        if (ex != null && ex instanceof WozzonException) {
            Toast.makeText(ctx, ex.getMessage(), Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(ctx, WLConstants._ERROR_MSG, Toast.LENGTH_SHORT).show();
        }

    }

    public abstract void onResult(Result result);
    public abstract Result inBackground(Param... parameters) throws Exception;

    @Override
    public void onCancel(DialogInterface theDialog) {
        cancel(true);
    }
}
0 голосов
/ 24 июня 2012

Теперь я использую его для блокировки экрана во время AsyncTask.Для меня это идеально сейчас.Надеюсь, это поможет вам.

private class PrepareAdapter extends AsyncTask<Void, Void, Integer>
            implements DialogInterface.OnCancelListener {
        private Dialog dialog = null;

        @Override
        protected void onPreExecute() {
            // To disable the whole screen --> setCancelable(false);
            dialog = new Dialog(WerWeissWasQuizActivity.this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
            dialog.setCancelable(false);
            dialog.show();
        }

        @Override
        protected Integer doInBackground(Void... params) {
            dialog.dismiss();
            return 0;
        }

        @Override
        protected void onPostExecute(Integer result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            //do other stuff...
        }

        @Override
        public void onCancel(DialogInterface dialog) {
            // TODO Auto-generated method stub
            cancel(true);
        }
    }
0 голосов
/ 21 февраля 2012

Ваша проблема не связана с темами вообще.Попробуйте setTextColor (# ff0000) и settextColor (# 00ff00) вместо settextColor (Color.RED) и setTextColor (Color.GREEN).

0 голосов
/ 21 февраля 2012

Вам необходимо использовать метод onPreExecute () функции ASyncTask ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...