android progressBar не обновляет обзор прогресса / извлекаемый

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

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 (…) в конце показывает ВСЕГДА правильные значения, но НЕОБХОДИМО видеть, что визуальные бары progressBars не показывают правильных прогессий. Они показывают прогресс, который был установлен ранее, даже если геттеры для «max» и «progress» возвращают правильные значения (в примере бар показывает около 20% (вместо 100%) для уровня HoldBar и около 2% (вместо 40 %) для уровня Up-bar). Я не могу понять, почему лог-вывод правильный, но чертежи ошибочны !? TextView (tv) обновлен правильно! Что тут происходит? Как я могу это исправить?

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

наконец … Я думаю, что нашел решение …

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

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

Похоже, что setProgress (…) не запускает обновление на drawable, если одно и то же значение передается снова. Но это также не срабатывает во время setMax. Поэтому обновление отсутствует. Кажется, что ошибка в android ProgressBar! Это заняло у меня около 8 часов. Lol: D

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

 bar.setMax(50); bar.setProgress(20); bar.setProgress(0); // <-- bar.setMax(20); bar.setProgress(20); 

Мне удалось заставить это работать с 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.

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

 Handler progressBarHandler = new Handler(); ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar1);; progressBarHandler .post(new Runnable() { public void run() { bar.setProgress(progress); } }); 

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

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

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

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

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

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

А затем вызовите метод update thumb после установки прогресса.

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

его работа для меня в вертикальных альберах

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

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

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

Проблема заключалась в том, что я менял ход выполнения. Выбираемый будет обновлен, но панель будет установлена ​​в 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)); 

Это сработало для меня …

OneFragmen.java

 public class OneFragment extends Fragment{ public OneFragment() { // Required empty public constructor } private Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager; int progress=0; private Handler handler = new Handler(); TextView txtProgress; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) { View view = inflater.inflate(R.layout.fragment_one, container, false); getActivity().setTitle(R.string.app_name); final ProgressBar spinner = (ProgressBar) view.findViewById(R.id.outerProgressBar); Resources res = getResources(); Drawable drawable = res.getDrawable(R.drawable.circular); txtProgress = (TextView)view.findViewById(R.id.txtProgress); spinner.setProgressDrawable(drawable); spinner.setSecondaryProgress(100); spinner.setMax(100); spinner.setProgress(0); new Thread(new Runnable() { @Override public void run() { while (progress < 100) { progress += 1; handler.post(new Runnable() { @Override public void run() { spinner.setProgress(progress); txtProgress.setText(progress + "%"); } }); try { Thread.sleep(28); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); return view; } } 

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

Мой код:

 class FixedSeekBar : SeekBar { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) companion object { private const val PROGRESS_MAX = 1000000.toDouble() } private var mLastMaxValue: Int = 100 override fun setMax(max: Int) { mLastMaxValue = max super.setMax(PROGRESS_MAX.toInt()) } fun setProgressFixed(progress: Int) { setProgress((PROGRESS_MAX / mLastMaxValue * progress).toInt()) } fun getProgressFixed(): Int { return (getProgress() / PROGRESS_MAX * mLastMaxValue).toInt() } } 

Это отлично работает для меня. Я могу назвать setMax как обычно, и мне просто нужно заменить getProgress и setProgress с помощью getProgressFixed и setProgressFixed .

Не переопределяйте setProgress и getProgress . Они называются внутренне.

Мое решение не учитывается с помощью setMin . Если вам это нужно, измените код соответствующим образом.

если вы любите полный прогресс

 time_prg_bar.setMax(100); time_prg_bar.setProgress(0); <-- 

если ваш уровень прогресса пуст

 time_prg_bar.setMax(100); time_prg_bar.setProgress(100); <-- 

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

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

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

Для меня работали, если я устанавливаю setVisibility () на видимый перед каждым setProgress ()

 setVisibility(View.VISIBLE); setProgress(progress); 
Давайте будем гением компьютера.