Probleme Progressbar Farbe ändern

T

Tom299

Stammgast
122
Hallo,

ich habe für meine Progressbar verschiedene Farb-Layouts angelegt (grün, rot, blau). Wenn ich mein Layout in der onCreate-Methode setze, dann funktioniert es auch einwandfrei.

Versuch ich jetzt während des "Progresses" das Layout zu ändern (z.B. mit rot starten, ab 30% blau und ab 80% grün), dann verschwindet meine Progressbar und sich sehe nichts mehr.

Beispielcode:
color.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="greenStart">#ff33dd44</color>  
    <color name="greenMid">#ff0A8815</color>  
    <color name="greenEnd">#ff1da130</color>    
    
    <color name="redStart">#ffdd3344</color>  
    <color name="redMid">#ff880A15</color>  
    <color name="redEnd">#ffa11d30</color>    
    
    <color name="blueStart">#ff3344dd</color>  
    <color name="blueMid">#ff0A1588</color>  
    <color name="blueEnd">#ff1A30a1</color>    
    
</resources>
red_progress.xml
Code:
<?xml version="1.0" encoding="utf-8"?>  
<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/redStart"  
                        android:centerColor="@color/redMid"  
                        android:centerY="0.75"  
                        android:endColor="@color/redEnd"  
                        android:angle="270"  
                />  
            </shape>  
        </clip>  
    </item>  
</layer-list>
green_progress.xml und blue_progress.xml sind fast identisch.


in der onCreate-Methode:
Code:
progBar.setProgressDrawable(getResources().getDrawable(R.drawable.red_progress));
und mein Update-Versuch sieht so aus (habs mit runOnUiThread und ohne versucht, mit und ohne invalidate(), doch es klappt nie ...
Code:
     private void checkProgressBarColor() {
        if (progressCounter[3] >= 30) {
            if (progressCounter[3] >= 80) {
                            progBar.setProgressDrawable(getResources().getDrawable(R.drawable.green_progress));
                progBar.invalidate();
            }
            else {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                                               progBar.setProgressDrawable(getResources().getDrawable(R.drawable.blue_progress));
                        progBar.invalidate();
                    }
                });
                
            }
        }
    }
jemand eine Idee woran es liegen könnte?
 
Ich denke es liegt am UI Thread das der iwie Blockiert wird versuch es doch mal mit einem AsyncTask | Android Developers .

wenn ich es ohne versuch wird bei mir nichtmal ne Progessbar angezeigt, hab dann nen leeres UI bis alles geladen ist.

MfG nijoX
 
Naja, es gibt ja verschiedene Möglichkeiten, beim Threading:
- runOnUiThread(new Runnable() { ...
- progBar.post(new Runnable() { ...
- AsyncTask
- Handler

Also daran sollte es nicht liegen, wobei ich den Progress selbst ja auch mit der 1. Methode iteriere:

Code:
        Button buttonStart = (Button)findViewById(R.id.id_button_start);
        buttonStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                initProgressCounterArray();
                final Thread progressThread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            while (getMaxProgressCount() <= 100) {
                                Thread.sleep(30);
                                
                                int random = (int)(Math.random()*6);
                                progressCounter[random]++;
                                
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        progressBar1.setProgress(progressCounter[0]);
                                        progressBar1.setText(progressCounter[0] + "/" + progressBar1.getMax());
                                        
                                        progressBar2.setProgress(progressCounter[1]);
                                        progressBar2.setText(progressCounter[1] + "/" + progressBar2.getMax());
                                        
                                        progressBar3.setProgress(progressCounter[2]);
                                        progressBar3.setText(progressCounter[2] + "/" + progressBar3.getMax());
                                        
                                        progressBar4.setProgress(progressCounter[3]);
                                        progressBar4.setText(progressCounter[3] + "/" + progressBar4.getMax());

                                        
                                        progBar.setProgress(progressCounter[3]);
                                        
                                        
                                        progressBar5.setProgress(progressCounter[4]);
                                        progressBar5.setText(progressCounter[4] + "/" + progressBar5.getMax());

                                        progressBar6.setProgress(progressCounter[5]);
                                        progressBar6.setText(progressCounter[5] + "/" + progressBar6.getMax());
                                        
                                        checkProgressBarColor();
                                    }
                                });            
                            }
                        }
                        catch (InterruptedException ie) {
                            ie.printStackTrace();
                        }
                    }
                });
                
                progressThread.start();
            }
        });

also eigentlich liegt mein aufruf von checkProgressBarColor() ja im UIThread ...
 
Code:
new AsyncTask<Void, Void, Void>(){
            public void onPreExecute(){
                //create und show ProgressBar
            }

            @Override
            protected Void doInBackground(Void... params) {
                //do das was die Progressbar verdecken soll
                publishProgress(); 
                return null;
            }

            protected void onProgressUpdate(Void... voi){
            //check und change Color
}
            protected void onPostExecute(Void z){
//UI elemente ändern falls nötig und ProgressBar wieder ausblenden
                
            }
        }.execute();
ob <Void, Void, Void> für dich passt oder ob du noch parameter brauchst weiß ich nicht hab es aber mal nachgebaut so in etwa und das gleiche Problem gehabt, das die Bar beim Layout ändern verschwindet. Mit AsyncTask gehts ;)

MfG nijoX
 
wie schon gesagt, es hängt nicht am Threading bei mir ...

ein Problem ist, daß das neue Drawable, wenn man es setzt, seine Größe nicht kennt und size 0 genommen wird -> ProgressBar verschwindet.

nun gibts im Inet Vorschläge, wie man das ändern kann. ich bekomm es dann zwar soweit hin, daß die ProgressBar an sich nicht mehr verschwindet, aber der "inhalt" wir nicht dargestellt. nur wenn ich das gleiche Drawable benutze, wird der Progress weiter fortgesetzt.

also wenn ich grünen progressbar habe und den grünen nochmal setze, dann läuft der progress weiter, setze ich aber rot oder blau, ist die progressbar "leer" und man hat nur den grauen hintergrund.

link dazu z.b. hier:
seekbar - Android ProgressBar.setProgressDrawable only works once? - Stack Overflow

hab aber gerade noch einen interessanten link mit verschiedenen vorschlägen gefunden, das muß ich aber erst mal selbst testen:
ProgressBar.setProgressDrawable bug - Android Developers | Google Groups
 
ok ich habs hinbekommen, fall es jemand interessiert:

Code:
            LayerDrawable layer = (LayerDrawable)progBar.getProgressDrawable();
            Drawable overlay = (Drawable)layer.findDrawableByLayerId(R.id.id_red_progress);
            Rect bounds = overlay.getBounds();
            overlay = getResources().getDrawable(R.drawable.green_progress);
            overlay.setBounds(bounds);
            layer.setDrawableByLayerId(R.id.id_red_progress, overlay);
 
  • Danke
Reaktionen: Madlip und Dreamweaver
Hi,

hab mir auch ne ProgressBar mit Handler gebastelt. Zum Testen wird per Button automatisch hoch und runter gezählt.

Das ganze soll jetzt ab einem bestimmten Wert(hier 140) zu einer anderen Farbe wechseln. Im ersten Abschnitt soll die Farbe erhalten bleiben.
Bei meinem Versuch läuft es bis 140 auch durch, wechselt die Farbe(komplett) und stoppt.

Leider versteh ich deinen Lösungsansatz nicht. Ist mein erstes Projekt in Android.

Hier mein Thread

Code:
new Thread(new Runnable() {
                    public void run() {
                        while (progressBarStatus < 281) {

                            // process some tasks
                            progressBarStatus = doSomeTasks();

                            // your computer is too fast, sleep 1 second
                            try {
                                Thread.sleep(50);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            
                            if(progressBarStatus >=0 && progressBarStatus <=140){
                                
                                if(!colorwhite){
                                    mProgress.setProgressDrawable(getResources().getDrawable(R.drawable.myprogressbar));
                                    colorwhite = true;
                                }
                                
                                // Update the progress bar
                                progressBarHandler.post(new Runnable() {
                                    public void run() {
                                        mProgress.setProgress(progressBarStatus);
                                    }
                                });
                            }
                            
                            else if(progressBarStatus >=141 && progressBarStatus <=280){
                                
                            if(colorwhite){
                                
                                mProgress.setProgressDrawable(getResources().getDrawable(R.drawable.myprogressbar2));
                                colorwhite = false;
                            }
                                
                                // Update the progress bar
                                progressBarHandler.post(new Runnable() {
                                    public void run() {
                                        
                                        mProgress.setProgress(progressBarStatus);
                                    }
                                });
                                                                
                            }
                            
                            else{}
                            
                            speed = progressBarStatus+" ";
                            speedHandler.post(new Runnable(){
                                public void run(){
                                    mSpeed.setText(speed);
                                }
                            });
                            
                            if (progressBarStatus ==280){
                                try {
                                    Thread.sleep(2000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                
                                accelerate = false;
                            } else if (progressBarStatus == 0) {
                                try {
                                    Thread.sleep(2000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                accelerate = true;
                            }
                        }
                    }
                }).start();
 
Zuletzt bearbeitet:
Ich kann dir leider keinen Code mehr zeigen, weil meine SSD im Arbeitsrechner vor 3 Wochen abgeraucht ist und die IT keine Daten retten konnte (oder wollte) ... alle Testprojekte sind damit weg.

Auf jeden Fall wars tricky, bis es bei mir so gefunzt hat, wie es sollte. Ich glaube aber, daß ich am Ende noch eine andere Lösung hatte als das hier gepostete :unsure:

Trick 17 wäre halt, du läßt mehrere Progressbars mit den gewünschten Farben laufen, machst aber nur die visible, welche die gewünschte Farbe hat. Dann mußt du dich nicht mit den verschiedenen Drawables usw. rumärgern.
 

Ähnliche Themen

S
Antworten
4
Aufrufe
995
Sempervivum
S
D
Antworten
14
Aufrufe
1.704
chrs267
chrs267
R
Antworten
3
Aufrufe
1.618
Ritartet
R
Zurück
Oben Unten