Можно ли изменить стиль, заголовок и сообщение ProgressDialog на лету? - PullRequest
2 голосов
/ 14 апреля 2011


Можно ли изменить стиль, сообщение и заголовок PD на лету (а не из потока пользовательского интерфейса)?

Я хочу сделать следующее.Первый раз PD отображается в STYLE_SPINNER, поскольку выглядит как бесконечный прогресс, и показывает сообщение, информирующее пользователя о том, что приложение ищет 4 чего-то (некоторый экземпляр обновления 4).И когда он обнаружил, что что-то должен сделать что-то с ним (установить его).В этот момент я хочу показать Горизонтальный стиль PD, так как он действительно отображает состояние прогресса, а не состояние в виде счетчика.

В любом случае я получил NullPointerException при попытке PD.setMax ().PD не является нулевым, поэтому я не могу понять, что происходит.

Это внутренний класс в моем классе Activity:

    private class RestoreDBTask extends AsyncTask <Void, Void, String>
    {

        private ProgressDialog dialog;

        private Handler handler;

        @Override
        protected void onPreExecute()
        {

            this.dialog = new ProgressDialog(SplashActivity.this);
            this.dialog.setTitle(getString(R.string.progress_wait));
            this.dialog.requestWindowFeature(Window.FEATURE_PROGRESS);
//            this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            this.dialog.setProgress(0);
            this.dialog.show();

            handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    RestoreDBTask.this.dialog.hide();

                    switch (msg.what) {
                    case 0:{
                        RestoreDBTask.this.dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                        break; }
                    case 1: {
                        RestoreDBTask.this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        break; }
                    case -1: {
                        RestoreDBTask.this.dialog.setMessage(getResources().getString(R.string.progress_db_installing));
                        break; }
                    case -2: {
                        RestoreDBTask.this.dialog.incrementProgressBy(1);
                        break; }
                    default: {
                        Log.i(APP_TAG,""+RestoreDBTask.this.dialog.getMax());
                        RestoreDBTask.this.dialog.setMax(msg.what); }
                    }

                    RestoreDBTask.this.dialog.show();
                }
            };
        }

        @Override
        protected String doInBackground(Void... params)
        {
            mDBHelper.initDB(dialog,handler);
            return "";
        }

        @Override
        protected void onPostExecute(String result)
        {
            dialog.dismiss();
            startNextActivity();
        }
    }

метод mDBHelper.initDB () использует обработчик.sendEmptyMessage () вызывает с некоторыми значениями int, предполагая, что если msg.what> 1, это максимальное значение для PD.
Также я не могу понять, почему PD не показывает состояние прогресса, если его стиль - STYLE_SPINNER?Если я изменю его на STYLE_HORIZONTAL, он будет работать нормально ...

Ответы [ 2 ]

6 голосов
/ 15 апреля 2011

Я столкнулся с тем, что стиль PD не может быть изменен после выполнения метода show () (но только b4), потому что это вызывает исключение NullPointerException, если приложение пытается вызвать методы setMax () / setProgress () / increment и т. Д. Послетот.Более того, стиль PD не изменяется визуально вообще, даже в случае использования схемы hide () -> change style-> show ().

Мое решение состоит в том, чтобы воссоздать PD в случае изменения его стиля (из спиннерав бар или по часовой стрелке).Но проблема в том, что я не могу получить Title и Message существующего PD, чтобы скопировать его в новый PD, потому что соответствующих методов (getTitle / getMessage) не существует, и это так глупо, потому что методы установки причины существуют, поэтому это нарушает правила Java-бинов.Почему они не предоставили геттеры?

В отличие от стиля PD, его заголовок и сообщение могут быть изменены на лету.

1 голос
/ 14 апреля 2011

Возможно ли изменить стиль, сообщение и заголовок PD на лету (а не из потока пользовательского интерфейса)?

Невозможно обновить содержимое пользовательского интерфейса в другом Thread.Вам нужно переопределить onProgressUpdate(), и там вы можете обновить пользовательский интерфейс, пока код в doInBackground() все еще обрабатывает.

Пример кода:

@Override
protected String doInBackground(Void... params) {

    // Use publishProgress() to update the UI thread from
    // a working background process.

    // If you have the initDB in another class you should probably
    // pass your RestoreDBTask instance to your initDB and call the instance's
    // makeProgress() method to successfully use publishProgress().
    mDBHelper.initDB(dialog, handler, this);
    return "";
}

@Override
protected void onProgressUpdate(Integer... params) {
    // If you gradually should update the ProgressDialog you probably need
    // an Integer value as argument in this method.

    // Update the ProgressDialog here.
}

public void makeProgress(Integer... params) {
    publishProgress(params);
}
...