Android ProgressBar не обновляет прогресс просмотра / рисования - PullRequest
21 голосов
/ 03 декабря 2010

два бара, которые показывают прогресс в игре.Если пользователь получает очки или время истекло и т. Д., Необходимо обновить индикатор выполнения:

private TextView tv;
private ProgressBar levelHoldBar;
private ProgressBar levelUpBar;

//...
private void updateViews() {

    // ...
    levelHoldBar.setMax(currentLevel.getThreshold());
    levelHoldBar.setProgress(currentPoints > currentLevel.getThreshold() ? currentLevel.getThreshold() : currentPoints);

    levelUpBar.setMax(nextLevel.getThreshold());
    levelUpBar.setProgress(currentPoints > nextLevel.getThreshold() ? nextLevel.getThreshold() : currentPoints);

    tv.setText(currentPoints+"/"+currentLevel.getThreshold());

    Log.d(TAG, "hold prog/max "+levelHoldBar.getProgress()+"/"+levelHoldBar.getMax());
    Log.d(TAG, "up   prog/max "+levelUpBar.getProgress()+"/"+levelUpBar.getMax());
}

т.е.Выходы:

12-03 17:48:33.918: DEBUG/MainActivity(6829): hold prog/max 20/20
12-03 17:48:33.918: DEBUG/MainActivity(6829): up   prog/max 20/50

Log.d (...) в конце показывает ВСЕГДА правильные значения, но НЕКОТОРЫЕ визуальные панели индикатора выполненияне показывают правильные ходы.Они показывают прогресс, который был установлен ранее, даже если получатели для «max» и «progress» возвращают правильные значения (в этом примере столбец показывает около 20% (вместо 100%) для levelHoldBar и около 2% (вместо 40).%) для уровня Up-bar).Я не могу понять, почему лог-вывод правильный, а рисованные - неправильные !?TextView (ТВ) обновляется правильно!Что тут происходит?Как я могу это исправить?

Ответы [ 15 ]

44 голосов
/ 04 декабря 2010

РЕШЕНИЕ : это ошибка в ProgressBar!

наконец-то ... я думаю, что нашел решение ...

это не работает так, как можно было бы ожидать:

bar.setMax(50);
bar.setProgress(20);
bar.setMax(20);
bar.setProgress(20);

setProgress (...), по-видимому, не запускает обновление отрисовки, если снова передается то же значение. Но это не срабатывает и во время setMax. Так что обновление отсутствует. Похоже, ошибка в Android ProgressBar! Это заняло у меня около 8 часов сейчас .. LOL: D

Чтобы решить эту проблему, я просто делаю bar.setProgress (0) перед каждым обновлением ... это только обходной путь, но он работает для меня, как и ожидалось:

bar.setMax(50);
bar.setProgress(20);
bar.setProgress(0); // <--
bar.setMax(20);
bar.setProgress(20);
19 голосов
/ 25 ноября 2014

Я смог заставить это работать с View.post():

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // ...

    mSeekBar.post(new Runnable() {
        @Override
        public void run() {
            mSeekBar.setProgress(percentOfFullVolume);
        }
    });
}

Как и в случае ответа SKT, мне непонятно, почему это должно работать, когда это не

mSeekBar.setProgress(percentOfFullVolume);

Тем не менее, похоже, что это верно до Android Lollipop включительно.

13 голосов
/ 12 июня 2012

Вы можете использовать обработчик для обновления progressbar

Handler progressBarHandler = new Handler();

ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar1);;

progressBarHandler .post(new Runnable() {

      public void run() {
          bar.setProgress(progress);
      }
});
9 голосов
/ 01 июля 2015

Для меня звонок по номеру setMax() до того, как setProgress() по какой-то причине сработал.

7 голосов
/ 22 августа 2013

В моем случае я создаю VerticalSeekBar, и решение Stuck не работает. После нескольких часов я нашел решение:

@Override
public synchronized void setProgress(int progress) {
    super.setProgress(progress);
    onSizeChanged(getWidth(), getHeight(), 0, 0);
}

Надеюсь, что кому-нибудь поможет.

3 голосов
/ 21 ноября 2013

Создать updateThumb (); метод в VerticalSeekbar

public void updateThumb(){
     onSizeChanged(getWidth(), getHeight(), 0, 0);
}

И затем вызвать метод обновления большого пальца после установки прогресса.

seekBar.setProgress((int) progress);
seekBar.updateThumb();

его работа для меня в вертикальной строке calss

2 голосов
/ 05 октября 2018

Я пытался разными способами, вызывая setProgress в Thread , runOnUiThread , Обработчик, Runnable .Все они не работают.

Итак, наконец, установите значение dialog.setIndeterminate (false); будет работать.

Как только вы установите dialog.setIndeterminate (правда) ;прогресс ОБНОВЛЕНИЕ НЕ БУДЕТ ВСЕ .

public static ProgressDialog createProgressDialog(Activity activity, int messageID, boolean cancelable) {
    ProgressDialog dialog = new ProgressDialog(activity, R.style.DialogButtonTint);
    dialog.setMessage(activity.getString(messageID));
    dialog.setIndeterminate(false);
    dialog.setMax(100);
    dialog.setSecondaryProgress(0);
    dialog.setProgress(0);
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setCancelable(cancelable);
    dialog.show();
    return dialog;
}
2 голосов
/ 21 февраля 2018

Убедитесь, что стиль для progressBar установлен на стиль = "@ андроид: стиль / Widget.ProgressBar.Horizontal" в противном случае будет отображаться неопределенный прогресс

(на всякий случай это кому-нибудь поможет)

1 голос
/ 27 июня 2018

Я перепробовал все перечисленные решения, они не работали. Оказывается ... реальная проблема заключалась в том, что мой код был занят выполнением, по существу блокируя поток пользовательского интерфейса. Поэтому правильное решение, которое немедленно решило проблему, заключалось в том, чтобы ... поместить мой занятой код в асинхронную задачу.

В моем случае я загружал несколько тысяч записей из XML в базу данных SQLite. Естественно я хотел обновить индикатор выполнения. Код, который должен был это сделать (prg_bar.setProgress (iProgressPercentage)), ничего не сделал, и в конце загрузки пользовательский интерфейс наконец-то получил шанс на запуск. Пуф, индикатор выполнения идет от нуля до 100.

Тот же код, помещенный в onProgressUpdate () асинхронной задачи, обернутый вокруг того же функционального кода, работал отлично. Это заставляет меня скептически относиться к идее «что в штрих-коде прогресса есть ошибка» и что установка максимума и нуля или любой из этих вещей была чем-то большим, чем просто случайная работа.

1 голос
/ 26 января 2015

Спасибо, Stuck за сообщение о том, что есть ошибка Android. У меня также есть вертикальная панель поиска.

Проблема заключалась в том, что я менял прогресс в рисовании. Drawable будет обновлен, но планка будет установлена ​​в 0 и будет очень маленького размера. Я смог заставить его изменить размер с помощью updateThumb (), но прогресс все еще был на уровне 0.

Чтобы вернуть прогресс в исходное значение, я добавил mylayer.setLevel (...) ;. Я нашел это, прочитав исходный код ProgressBar.doRefreshProgress (...). Вы могли бы сделать seekBar.getProgressDrawable.setLevel(...).

LayerDrawable mylayer = //new LayerDrawable()
seekBar.setProgressDrawable(mylayer);
seekBar.updateThumb();
seekBar.setProgress((int) chLevel);
mylayer.setLevel((int) (chLevel / MAX_LEVEL * 10000));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...