Как сделать так, чтобы Android ProgressBar определялся в коде?

Я пытаюсь добавить индикатор выполнения в код и сделать его определенным:

progressBar = new ProgressBar(getActivity());
progressBar.setLayoutParams(layoutParams);
parent.addView(progressBar, index);
progressBar.setId(id.list_item_secondary);
progressBar.setProgressDrawable(getResources().getDrawable(drawable.progress_horizontal));
progressBar.setIndeterminate(false);
progressBar.setMax(100);

После progressBar.setIndeterminate(false) isIndeterminate по-прежнему верно, а прогресс продолжает показывать неопределенный круг.

Как я могу определить его?


person AlikElzin-kilaka    schedule 22.07.2013    source источник


Ответы (4)


Из исходного кода ProgressBar здесь, конструктор, который вы вызываете, находится в строке 237, которая вызывает конструктор в строке 241, который, в свою очередь, вызывает конструктор в строке 245 со стилем:

com.android.internal.R.attr.progressBarStyle

Этот стиль имеет атрибут android:indeterminateOnly, установленный по умолчанию в true, поэтому ваши вызовы setIndeterminate игнорируются. См. описание функции в строке 433.

Я этого не делал, но предполагаю, что если вы вызовете конструктор в строке 245 следующим образом:

progressBar = new ProgressBar(getActivity(), null, <Your Style ID>);

передача в качестве третьего параметра определения стиля с android:indeterminateOnly в false должна работать. Основываясь на исходном коде, я предполагаю, что setIndeterminate существует только для его включения, а не для его отключения.

Надеюсь это поможет...

person ChD Computers    schedule 22.07.2013
comment
Знаете ли вы о таком стиле в рамках Android? - person AlikElzin-kilaka; 22.07.2013
comment
@kilaka Я думаю, что android.R.style.Widget_ProgressBar_Horizontal справится со своей задачей... - person ChD Computers; 22.07.2013
comment
Этого было недостаточно. Мне пришлось установить прогресс: progressBar.setProgressDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal)) - person AlikElzin-kilaka; 23.07.2013
comment
Подводя итог: для indeterminateOnly по умолчанию установлено значение true, что предотвращает изменение на детерминированное. Это можно изменить только стилем, который задается только в конструкторе. - person AlikElzin-kilaka; 23.07.2013
comment
Примечание: номера строк, которые вы написали выше, отличаются от одной версии Android к другой. Вы ссылаетесь на основную ветку. На многих телефонах работает не мастер, а одна из веток выпуска. Кроме того, мастер может измениться, и ваши номера строк больше не будут актуальны. - person AlikElzin-kilaka; 23.07.2013
comment
Кроме того, даже при использовании более нового встроенного стиля (Widget_Holo_Light_ProgressBar_Horizontal) прогресс выглядит желтоватым и старым. Вот чертежи, необходимые для нового синеватого вида: ppl.ug/cAHLkaL7aic. Просто поместите его в папку drawable-xhdpi и укажите ссылку на него: drawable.progress_horizontal_holo_light. Наслаждаться. - person AlikElzin-kilaka; 23.07.2013
comment
Ссылка больше недоступна @AlikElzin-kilaka... - person Joan Casadellà; 14.07.2016

Не похоже, что вы устанавливаете атрибут стиля ProgressBar. Из документов для setIndeterminate():

Если стиль этого индикатора выполнения поддерживает только неопределенный режим (например, круглые индикаторы выполнения), то он будет проигнорирован.

Вы должны вручную установить стиль, например. через style="@android:style/Widget.ProgressBar.Horizontal". Просто изменить Drawable недостаточно.

person Geobits    schedule 22.07.2013
comment
Итак, как мне установить стиль индикатора выполнения? - person AlikElzin-kilaka; 22.07.2013
comment
Вы можете установить его в конструкторе, например: stackoverflow.com/a/3765577/752320 - person Geobits; 22.07.2013
comment
А еще лучше используйте style="?android:progressBarStyleHorizontal", чтобы выбрать заданный стиль темы. - person nmr; 11.10.2014

В вашем стиле ProgressBar по умолчанию для android:indeterminateOnly установлено значение true. Таким образом, вы не можете изменить неопределенное состояние ProgressBar. исходный код.

person Leonidos    schedule 22.07.2013
comment
Итак, как я могу сделать это определенным? - person AlikElzin-kilaka; 22.07.2013
comment
Вы видели источник? Это невозможно) Используйте правильный стиль в конструкторе. @Geobits прав. - person Leonidos; 23.07.2013

Попробуйте также использовать setProgress(), который принимает целочисленный аргумент от нуля до getMax().

person Karakuri    schedule 22.07.2013
comment
Уже пробовал. Не работает. Как вы думаете, почему это должно сработать? - person AlikElzin-kilaka; 22.07.2013