Как изменить цвет круга ProgressBar по умолчанию на Android

В настоящее время я использую внешнюю библиотеку в своем проекте Android, импортированном через Gradle.
В этой библиотеке отображается панель уведомлений с кружком ProgressBar. Вот код, который я нашел в его источниках:

<ProgressBar
            android:id="@+id/progress_bar"
            android:layout_height="match_parent"
            android:layout_marginBottom="4dp"
            android:layout_marginTop="4dp"
            style="@style/SuperActivityToast_Progress_ProgressBar"/>

Стиль связан с этим:

<style name="SuperActivityToast_Progress_ProgressBar" parent="android:Widget.Holo.ProgressBar">
    <item name="android:layout_width">32dp</item>
    <item name="android:layout_marginLeft">8dp</item>
</style>

Если я правильно понимаю, цвет показанного круга получен из цвета по умолчанию (зеленый на моем телефоне). Мне нужно изменить это!

Теперь я не могу изменить исходный код, и сама библиотека не дает мне возможности устанавливать стиль программно.

Есть способ изменить стиль по умолчанию на уровне приложения или лучше переопределить этот конкретный стиль?

Спасибо давиде

3 ответа

Решение

После нескольких попыток я нашел решение:

ProgressBar progBar = (ProgressBar) context.getActivity().findViewById(R.id.progress_bar);
if (progBar != null) {
    progBar.setVisibility(View.VISIBLE);
    progBar.setIndeterminate(true);
    progBar.getIndeterminateDrawable().setColorFilter(0xFFFFFFFF, android.graphics.PorterDuff.Mode.MULTIPLY);
}

Просто я получу ссылку на объект индикатора выполнения, созданный библиотекой, и я изменю его атрибуты. (в моей деятельности я должен сделать это в методе "OnStart", в противном случае он будет нулевым). Наиболее важной частью является "setColorFilter", который делает магию.

Если вы используете тему AppCompat, она использует accentColor для окрашивания круга.

Если вы хотите подкрасить его в другой цвет, чем тема, то вам следует рассмотреть возможность использования ThemeOverylay. Например, если вы хотите сделать оттенок круга red Вы могли бы сделать следующее:

в вашем styles.xml

<style name="RedAccent" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">#F00</item>
</style>

в вашем ProgressBar установить тему на RedAccent,

<ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:theme="@style/RedAccent"/>

И ваш круг теперь будет красного цвета!

Для будущих ссылок, это изменение сработало для меня:

Изменение colorControlActivated в AppTheme в вашем файле values ​​/styles.xml:

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Main theme colors -->
    ....
    <!-- Color for circle in progress bar -->
    <item name="colorControlActivated">#DC0808</item>
</style>

При таком подходе вам не нужно выполнять какие-либо действия на вашем <ProgressBar/> тег в вашем XML-файле.

Просто добавьте цвет в ProgressBar, как показано ниже:

    <ProgressBar
    android:id="@+id/progressbar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:visibility="gone"
    android:indeterminateTint="@color/colorPrimary"  // add color here
    android:layout_centerVertical="true"/>
Другие вопросы по тегам