Використання SeekBar та setProgress не змінює позицію шукатиBar

Я використовую Seekbar у фрагменті та потрібно перемістити Seekbar в різні позиції. Однак, setProgress (xxx) не працює.

Як програму спричинити цей метод для Seekbar : public void onProgressChanged (SeekBar searchBar, int progress, boolean fromUser) ? Переміщення Seekbar вручну працює нормально.

4

6 Відповіді

Це помилка в ProgressBar!

Схоже, що setProgress (...) не ініціює оновлення на drawable , якщо це одне значення знову передано. Але це також не спрацьовує під час установки setMax. Отже, оновлення відсутнє.

Щоб вирішити це, я просто виконую bar.setProgress (0) перед кожним оновленням ... це лише обхідний шлях, але він працює для мене як очікується:

bar.setProgress(0);//call these two methods before setting progress.
bar.setMax(20);
bar.setProgress(20);

Другий варіант.

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

це може також працювати для когось.

Спробуйте спершу встановити максимальне значення, а потім встановити прогрес.

8
додано
Husnain Iqbal ви можете використовувати другий метод методом postDelayed і передавати 100 як час затримки. Тоді він працюватиме швидше.
додано Автор Nepster, джерело
Другий працював для мене. і я здивував це 2018 і ця помилка зберігається.
додано Автор DoruChidean, джерело
Це не працює для мене :(
додано Автор Husnain Iqbal, джерело
Я отримав рішення :), викликаючи шукаю Bare.setProgress (прогрес) всередині onProgressChanged() і залишковий метод (-и) в onStopTrackingTouch() всередині setOnSeekBarChangeListener. Дякую
додано Автор Husnain Iqbal, джерело

Я додаю коментар до цієї теми, тому що це було мені щасливим, і мені знадобилося кілька годин, щоб з'ясувати, яка проблема. Помилка залишається активною, і інколи метод setProgress () іноді працює неправильно.

У мене є основна активність, яка здійснює та замінює фрагменти та передає значення SeekBar усередині пачки кожного фрагмента. Користувач змінює значення панелі Seekbar і його просування вносяться в пакет . Потім, коли користувач перемикає фрагмент , новий отримує SeekBar прогрес.

Він прекрасно працює, щоб передавати його таким чином, і я завжди маю правильне значення в моїй змінній прогресу у другому фрагменті . Проблема з'являється, коли я використовую метод setProgress (theProgressValueTransmitted). Це встановлює мій SeekBar прогрес лише в перший раз, коли я замінюю перший фрагмент. Після цього він ніколи не змінює коефіцієнту прогресу.

Я використав :

int seekBarProgress;
Bundle bundle = this.getArguments();
    if (bundle != null) {
        seekBarProgress = bundle.getInt("seekBarProgress");
    mySeekBar.post(new Runnable() {
                @Override
                public void run() {
                    eventListTimeSeekBar.setProgress(seekBarProgress);

                }
            });
    }

І це єдиний спосіб зробити цю роботу. Сподіваюся, це може допомогти комусь з такою ж проблемою. Цей пост старше 4 років, я навіть не розумію, як ця помилка все ще може існувати з моменту повідомлення.

2
додано

SeekBar.setProgress() should work just fine. Are you sure your code is executing on the UI thread? If not, then this would be the obvious explanation. Check the example in the API doc for ProgressBar

https://developer.android.com/reference/android/widget/ProgressBar.html

Там вони показують, як повернути виконання до основної нитки.

1
додано
Дякую за відповідь. Я не працював з потоками, тому я не впевнений, що він виконує в потоці користувальницького інтерфейсу. Я його досліджу.
додано Автор sowens, джерело

Я додаю цю відповідь, оскільки це може допомогти комусь у майбутньому.
У моєму випадку я також вважав, що setProgress не працює належним чином, але ось моя помилка.

increaseIncomeSeekBar.setProgress(progress);
increaseIncomeSeekBar.setMax(maxProgress);

Для прогресу інформації та maxProgress дорівнює 2000 і 12000. Але при відображенні SeekBar, здається, що прогрес досяг 0 і, таким чином, не працює належним чином.
Ви повинні знати про це, що є досить логічним, коли ви це знаєте:

  • first SeekBar max = 100.
  • when you set a progress > max then progress = max.
  • so you need to set a max value before setting a progress value.
1
додано

Сьогодні все, здається, працює як очікується.
Пост більше не потрібний.
Просто:

seekBar.setMax(200);
seekBar.setProgress(50);

(порядок не має значення)

0
додано

У більшості випадків SeekBar відмінно працює. Іноді це не буде.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    //...
    seekBar.setProgress(value);
    //...
}

Після того як я оновлюю вигляд фрагмента за допомогою detach() + attach (), код не працює. Моє рішення - застосувати setProgress() до "onViewStateRestored ()".

@Override
public void onViewStateRestored(Bundle inState) {
    //...
    seekBar.setProgress(value);
    //...
}
0
додано
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.