web-dev-qa-db-fra.com

Comment changer la couleur par défaut du cercle ProgressBar sur Android

J'utilise actuellement une bibliothèque externe dans mon Android importé via gradle.
Cette bibliothèque affiche une barre de notification avec un cercle ProgressBar. Voici le code que j'ai trouvé dans ses sources:

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

Le style associé est celui-ci:

<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>

Si je comprends bien, la couleur du cercle affiché est dérivée de celle par défaut (verte sur mon téléphone). J'ai besoin de le changer!

Maintenant, je ne peux pas modifier le code source et la bibliothèque elle-même ne m'offre pas la possibilité de définir le style par programmation.

Il existe un moyen de modifier le style par défaut au niveau de l'application ou de remplacer ce style spécifique?

Merci Davide

14
Davide

Après plusieurs tentatives, j'ai trouvé une solution:

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);
}

Simplement, je vais obtenir une référence de l'objet de barre de progression créé par la bibliothèque et je change ses attributs. (dans mon activité je dois le faire dans une méthode "OnStart" sinon c'est nul) La partie la plus importante est le "setColorFilter" qui fait la magie.

29
Davide

Si vous utilisez le thème AppCompat, il utilise le accentColor pour teinter le cercle.

Si vous souhaitez le colorer dans une couleur différente de celle du thème, vous devez envisager d'utiliser ThemeOverylay. Par exemple. Si vous souhaitez rendre la teinte du cercle red, vous pouvez procéder comme suit:

dans ton styles.xml

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

dans votre ProgressBar, définissez le thème sur RedAccent.

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

Et votre cercle sera maintenant de couleur rouge!

49
bond

Pour les références futures, ce changement a fonctionné pour moi est:

Modification du colorControlActivated dans AppTheme dans votre fichier 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>

Avec cette approche, vous n'avez pas besoin d'effectuer d'action sur votre <ProgressBar/> tag dans votre fichier xml.

5
Red M