601 Stimmen

So ändern Sie die Farbe des Fortschrittsbalkens in Android

Ich verwende einen horizontalen Fortschrittsbalken in meiner Android-Anwendung, und ich möchte die Fortschrittsfarbe ändern (die standardmäßig gelb ist). Wie kann ich das tun mit code (nicht XML)?

0 Stimmen

Haben Sie versucht, MyProgressBar.setProgressDrawable(Drawable d), die eine Bitmap mit der gewünschten Farbe angibt? developer.Android.com/reference/Android/widget/ developer.Android.com/reference/Android/graphics/drawable/

2 Stimmen

Ja, ich habe es versucht, aber es funktioniert nicht. Es setzt die Hintergrundfarbe der gesamten Fortschrittsbalken-Ansicht, anstatt die Hintergrundfarbe nur des Balkens selbst zu setzen. Danke!

76 Stimmen

android:indeterminateTint="@android:color/white" funktioniert nur bei API >=21

555voto

FFirmenich Punkte 5101

Dies ist zwar nicht programmatisch, aber ich denke, es könnte trotzdem vielen Menschen helfen.
Ich habe viel ausprobiert und der effizienteste Weg war, diese Zeilen zu meiner ProgressBar in der .xml-Datei hinzuzufügen:

            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary"

Letztendlich hat mich dieser Code also überzeugt:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginTop="50dp"
            android:layout_marginBottom="50dp"
            android:visibility="visible"
            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary">

Diese Lösung funktioniert für API 21+

0 Stimmen

Für diese Eigenschaften gibt es auch Setter-Methoden, die aufgerufen werden können, wenn eine dynamische Farbe eingestellt werden muss.

0 Stimmen

Muss ich eine eigene Ressourcendatei für api 21+ und api <= 20 erstellen? Oder werden diese Attribute bei api <= 20 einfach ignoriert?

1 Stimmen

@shriduttkothari wie kann es das Beste sein?... es ab 21+

541voto

Torben Kohlmeier Punkte 6493

Für eine horizontale ProgressBar können Sie eine ColorFilter auch, wie hier:

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

Red ProgressBar using color filter

Dadurch wird das Aussehen aller Fortschrittsbalken in Ihrer Anwendung geändert. Um nur einen bestimmten Fortschrittsbalken zu ändern, gehen Sie folgendermaßen vor:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

Wenn progressBar unbestimmt ist, verwenden Sie getIndeterminateDrawable() anstelle von getProgressDrawable() .

Seit Lollipop (API 21) können Sie eine Verlaufstönung einstellen:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

Red ProgressBar using progress tint

7 Stimmen

Ich wollte diese Antwort verwenden, da sie mir am einfachsten erschien, aber mein Fortschrittsbalken ist unabhängig vom Fortschrittswert komplett rot. Sind Sie sich sicher, welchen Modus Sie verwenden sollen?

0 Stimmen

Ich habe es gerade noch einmal getestet, hier funktioniert es perfekt. Haben Sie einen Fortschritt eingestellt? Vielleicht sehen Sie nur den hellroten Hintergrund.

0 Stimmen

Ja, ich habe einen Fortschritt eingestellt, ich musste eine Farbe mit Transparenz einstellen, damit das funktioniert. Ich testete es auf Android 2.2, nicht sicher, ob es einen Einfluss haben könnte.

316voto

Alex Volovoy Punkte 66760

Es tut mir leid, dass es nicht die Antwort ist, aber was ist der Grund dafür, dass die Anforderung im Code festgelegt wurde? Und .setProgressDrawable sollte funktionieren, wenn sie korrekt definiert ist

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@android:id/background">
    <shape>
        <corners android:radius="5dip" />
        <gradient
                android:startColor="#ff9d9e9d"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:angle="270"
        />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#80ffd300"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:angle="270"
            />
        </shape>
    </clip>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>

6 Stimmen

Der Grund dafür ist, dass ich den Fortschrittsbalken dynamisch erstelle und seine Farbe auf Benutzeranforderung einstelle. Da ich in der Regel Code für den Aufbau meiner GUI-Bildschirm und Komponenten verwenden, bin ich nicht vertraut mit der beigefügten XML und ich weiß nicht, was ist eine Layer-Liste (obwohl ich vermute, dass Sie den Fortschrittsbalken basierend auf mehreren Ebenen bauen ). Für den Fall, dass ich die von Ihnen beigefügte XML-Datei verwenden möchte - wo sollte ich sie im Projektordner ablegen und gibt es noch etwas, was ich tun muss, um einen Fortschrittsbalken auf der Grundlage der XML-Einstellungen zu erstellen? Vielen Dank!

1 Stimmen

Sie speichern diese xml als Datei und legen Sie es in der drawable Ordner (sagen wir my_progress.xml), als Sie es als drawable in MyProgressBar.setProgressDrawable() Um Farben zu ändern - Sie müssen diese Werte in @color/progress_start @color/progress_end Es ist im Grunde ein Farbverlauf und Sie können hex in dort.

3 Stimmen

Hinweis: Die Datei ist eine Kopie der im SDK enthaltenen Datei. Ich habe das Copyright hier weggelassen. Wenn Sie in der res/drawable Ordner sehen Sie genau das, was ich gepostet habe - Farben sind auf den gelben Farbverlauf eingestellt, anstelle von benutzerdefinierten Farben.

246voto

jhavatar Punkte 3196

Für meinen unbestimmten Fortschrittsbalken (Spinner) habe ich einfach einen Farbfilter auf die Zeichenfläche gesetzt. Funktioniert super und nur eine Zeile.

Beispiel für die Einstellung der Farbe auf Rot:

ProgressBar spinner = new android.widget.ProgressBar(
                context,
                null,
                android.R.attr.progressBarStyle);

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);

enter image description here

17 Stimmen

Ihre Antwort gefällt mir am besten. Für meine zu arbeiten, aber ich hatte dies zu tun: myProgressBarSpinner.getIndeterminateDrawable().setColorFilter(new LightingColorFilter(0xFF000000, foregroundColorDesired));

5 Stimmen

Beachten Sie auch, dass dadurch die Drawables ALLER Fortschrittsbalken in Ihrer Anwendung verändert werden. Um dies nur für einen bestimmten zu tun, rufen Sie mutate() auf drawable, dann setzen Sie Farbfilter auf sie und rufen Sie dann setIntederminateDrawable auf Ihrem progressBar.

3 Stimmen

NB: Diejenigen, die dies verwenden und sich wundern, warum ihre Farbe nicht genau so aussieht wie die Hexadezimalzeichenfolge, die sie eingegeben haben, haben einen Filter für mehrere Farben aktiviert. ändern android.graphics.PorterDuff.Mode.MULTIPLY à PorterDuff.Mode.SRC_IN und Sie erhalten die genaue Hex-Farbe.

219voto

kirtan403 Punkte 6889

Dies ist eine alte Frage, aber die Verwendung von Themen wird hier nicht erwähnt. Wenn Ihr Standard-Theme Folgendes verwendet AppCompat , Ihr ProgressBar wird die Farbe von colorAccent die Sie definiert haben.

Ändern von colorAccent wird auch Ihr ProgressBar Farbe, aber die Änderungen spiegeln sich auch an mehreren Stellen wider. Wenn Sie also eine andere Farbe nur für eine bestimmte PregressBar Sie können dies tun, indem Sie das Thema auf diese ProgressBar :

  • Erweitern Sie Ihr Standardthema und überschreiben Sie colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
  • Und in ProgressBar die android:theme Attribut:

    android:theme="@style/AppTheme.WhiteAccent"

Es wird also in etwa so aussehen:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

Sie ändern also lediglich eine colorAccent für Ihr spezielles ProgressBar .

Hinweis : Verwendung von style wird nicht funktionieren. Sie müssen verwenden android:theme nur. Weitere Verwendungsmöglichkeiten des Themas finden Sie hier: https://plus.google.com/u/0/+AndroidEntwickler/posts/JXHKyhsWHAH

20 Stimmen

Endlich! Danke, es scheint, als ob nicht viele Entwickler AppCompat verwenden, viele Benutzer stimmen nur Antworten mit Lösungen für API 21+ ab, das ist überhaupt nicht gut, sie sollten mehr Geräte/OS wie möglich unterstützen

1 Stimmen

Unglaublich! Funktionierte für mich, aber ich musste sicherstellen, dass es ein parent="@style/Theme.AppCompat" irgendwo oben in der Stil-Hierarchie hatte ich eine andere übergeordnete und es funktionierte nicht auf den ersten.

0 Stimmen

@Nublodeveloper Ja, das habe ich in der ersten Zeile erwähnt, falls Sie es bemerkt haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X