Wie ändere Android unbestimmte ProgressBar Farbe?

74

Ich möchte wissen, wie ich eine unbestimmte ProgressBarFarbe von der Basisfarbe Weiß / Grau in Schwarz ändern kann . Wenn ich das ändere indeterminateDrawable, erhalte ich ein statisches Bild anstelle einer sich bewegenden animierten Fortschrittsleiste. Gibt es eine Möglichkeit, dies einfach in XML zu tun?

mwa
quelle

Antworten:

81
progressBar.getIndeterminateDrawable().setColorFilter(
            getResources().getColor(Your_Color),
            android.graphics.PorterDuff.Mode.SRC_IN);

und ersetzen Sie Your_Color durch die gewünschte Farbe wie: R.color.your_color_code

Zeyad Assem
quelle
Dies ist der schnellste und einfachste Weg.
Pau Arlandis Martinez
14
Könnte in XML definieren:android:indeterminateTint="@colors/your_color" android:indeterminateTintMode="src_in"
Peter Zhao
2
@zhaoyuanjie android: indeterminateTint funktioniert nur auf API-Level 21+
Vinay W
Ich bin froh, dass ich nach unten gescrollt habe - dies sollte die akzeptierte Antwort sein.
Zsolt Safrany
Ist all das Porter-Duff-Geschäft wirklich notwendig? :(
Nerdy Bunz
64

Verwenden Sie einen der umgekehrten Stile, um eine ProgressBar im Standarddesign zu erhalten, das auf weißem / hellem Hintergrund verwendet werden soll:

<ProgressBar style="@android:style/Widget.ProgressBar.Inverse"/>
<ProgressBar style="@android:style/Widget.ProgressBar.Large.Inverse"/>
<ProgressBar style="@android:style/Widget.ProgressBar.Small.Inverse"/>

Dadurch wird die transparente ProgressBar normalerweise schwarz angezeigt. Bei einigen Betriebssysteminstallationen werden jedoch benutzerdefinierte Assets verwendet. Wenn Sie nach einer bestimmten Farbe suchen, müssen Sie Ihre eigenen Zeichen rollen, indem Sie den Anweisungen von CommonsWare folgen.

Anm
quelle
Dies scheint keine geräteunabhängige Lösung zu sein. Auf meinem LG Optimus 2X Speed ​​ist eine unbestimmte ProgressBar immer noch schwarz, während sie auf einem HTC Desire HD mit CyanogenMod für 2.3.3 immer rot ist.
Paul Lammertsma
@ Paul - Ja, du bist richtig. Viele Gerätehersteller passen die Designs an, und das Standarddesign kann zwischen den Android-Versionen wechseln. Ich werde den obigen Text korrigieren
Anm
34

Ich sehe, dass andere Antworten ziemlich alt sind. Um die unbestimmte ProgressBar-Farbe zu ändern, müssen Sie nur die Attribute android:indeterminateTintund android:indeterminateTintModeAttribute in Ihrem ProgressBarElement direkt in XML festlegen :

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:indeterminateTint="@color/colorPrimary"
    android:indeterminateTintMode="src_in"
    android:indeterminate="true" />

android:indeterminateTint - Farbton für die unbestimmte Fortschrittsanzeige.

Muss ein Farbwert sein, in Form von "#rgb", "#argb", "#rrggbb", "#aarrggbb", oder einer Referenz auf eine Ressource @color/colorPrimary.

android:indeterminateTintMode - Mischmodus zum Anwenden der Fortschrittsanzeige.

Muss eine der folgenden konstanten Werte annehmen:
add, multiply, screen, src_atop, src_inodersrc_over

Getter- und Setter-Methoden für diese Attribute sind:

Alle von ihnen wurden in API Level 21 hinzugefügt

Cliff Burton
quelle
1
So frustrierend! In Android Studio müssen Sie die Option Alle Attribute anzeigen verwenden, um auf indeterminateTintMode zuzugreifen und es dann in src_in zu ändern ... Ich wollte das NICHT selbst herausfinden. Vielen Dank!
Roller
6
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background" android:drawable="@drawable/bg" />
    <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/secondary" />
    <item android:id="@android:id/progress" android:drawable="@drawable/progress" />
</layer-list>
andro_stackoverflow
quelle
3

Für API weniger als 23 verwenden

progressBar.getIndeterminateDrawable().setColorFilter(
       getResources().getColor(Your_Color),
        android.graphics.PorterDuff.Mode.SRC_IN);

sonst verwenden

progressBar.getIndeterminateDrawable().setColorFilter(
        ContextCompat.getColor(context, Your_Color),
        android.graphics.PorterDuff.Mode.SRC_IN);
yasirbhat564
quelle
1

Überschreiben Sie android:colorControlActivatedin Ihrem AppTheme die in Ihrem styles.xml sein sollte:

<style name="AppTheme" parent="...">
    ...
    <item name="android:colorControlActivated">@color/beautiful_color</item>
    ...
</style>

Funktioniert mit API 21+

janosch
quelle
1
Einfachster Weg. Vielen Dank!
MasterMind
-5

Eigentlich müssen Sie nur eine XML-Datei in Drawable erstellen (siehe unten). progress_spinner_001 zeigt auf das Bild, das Sie animieren möchten, und auf die Dauer, die Sie anzeigen möchten Frame für ....... und setze dein Android: indeterminateDrawable = Dateiname_in_drawable ....

<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
<item android:drawable="@drawable/progress_spinner_001" android:duration="300" />
<item android:drawable="@drawable/progress_spinner_002" android:duration="300" />
<item android:drawable="@drawable/progress_spinner_003" android:duration="300" />
  <item android:drawable="@drawable/progress_spinner_004" android:duration="300" />
    <item android:drawable="@drawable/progress_spinner_005" android:duration="300" />
      <item android:drawable="@drawable/progress_spinner_006" android:duration="300" />
     <item android:drawable="@drawable/progress_spinner_007" android:duration="300" />
    <item android:drawable="@drawable/progress_spinner_008" android:duration="300" />
</animation-list>

ps u muss möglicherweise die Größe des Fortschrittsbalkens ändern, damit er wie gewünscht angezeigt wird

Rasen
quelle
4
-1: Diese Antwort sagt "wie unten gezeigt", aber es zeigt nichts. Ich finde es sehr schwer zu verstehen.
Richard Le Mesurier