1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Probleme Progressbar Farbe ändern

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tom299, 05.10.2011.

  1. Tom299, 05.10.2011 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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?
     
  2. nijoX, 05.10.2011 #2
    nijoX

    nijoX Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    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
     
  3. Tom299, 05.10.2011 #3
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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 ...
     
  4. nijoX, 07.10.2011 #4
    nijoX

    nijoX Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    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
     
  5. Tom299, 07.10.2011 #5
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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
     
  6. Tom299, 07.10.2011 #6
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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);
    
     
    Madlip und Dreamweaver haben sich bedankt.
  7. GSUS24, 03.09.2012 #7
    GSUS24

    GSUS24 Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    07.05.2012
    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: 03.09.2012
  8. Tom299, 04.09.2012 #8
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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.
     

Diese Seite empfehlen