Android Progress Bar nach Zeit füllen?
Hey, ich möchte eine Progressbar machen, die sich in einer bestimmten Zeit auffüllt.
Das heißt: Stelle ich 5 Sekunden ein, wird sie nach einem buttondruck innerhalb von 5 Sekunden gefüllt. (Nach 2,5 sekunden halb, nach 5 Sekunden dann ganz).
Wie muss der Code dazu ungefähr ausschauen bzw hat einer von euch eine Idee wie ich das Hinbekommen kann?
Ich hoffe ich konnte es verständlich ausdrücken.
LG, fishgamer
1 Antwort
Ganz grob und möglicherweise ein wenig fehlerhaft, da nicht (komplett) getestet:
new Thread(){
@Override public void run(){
try{
for(int progress = 0; progress <= 100 && !isInterrupted(); progress += 50){
runOnUiThread(new Runnable(){
@Override public void run(){
myProgressBar.setProgress(progress);
}
});
Thread.sleep(2500);
}
}
catch(InterruptedException ex){}
}
}.start();
In dem Fall wird angenommen, dass die ProgressBar unter dem Identifier myProgressBar "erreichbar" ist.
Okay, in dem Fall könntest du das ganze z.B. so abändern:
new Thread(){
@Override public void run(){
try{
for(int progress = 0; progress <= 100 && !isInterrupted(); ++progress){
runOnUiThread(new Runnable(){
@Override public void run(){
myProgressBar.setProgress(progress);
}
});
Thread.sleep(50);
}
}
catch(InterruptedException ex){}
}
}.start();
50 Millisekunden = 1% von 5 Sekunden.
Ich habe nochmal eine Frage:
Ich kenne mich nich viel mit Threads aus. Wo müsste ich das ganze aufrufen bzw. wo müsste ich diesen Thread aufgreifen?
Wenn du diesen Codeschnipsel so wie er ist verwenden willst, dann kommt er dahin, wo festgestellt wurde, dass der Button gedrückt wurde.
Also in etwa so:
public void OnClick(View v){
if(v == myButton){
/*Hier der Code*/
}
}
Okay das funktioniert super, danke!
Nur, ich möchte dass das ganze bei einem TouchEvent gemacht wird.
Damit meine ich: Solange man einen Button drückt, füllt sich die Progress bar, wenn man ihn loslässt, setzt sie sich wieder auf 0. Wenn sie voll ist soll sie ebenfalls auf 0 gesetzt werden.
Wie breche ich diesen Thread ab?
Okay, das wir n bissl schwieriger.
Zunächst mal verpasst du deiner Klasse ein boolean-Feld, z.B.
protected boolean stop_thread;
Dann im Event-Code der aufgerufen wird, sobald der Button losgelassen wird das:
stop_thread = true;
Und noch im Event-Code für "Button gedrückt" das:
stop_thread = false;
new Thread(){
@Override public void run(){
try{
for(int progress = 0; progress <= 100 && !isInterrupted() && !stop_thread; ++progress){
runOnUiThread(new Runnable(){
@Override public void run(){
myProgressBar.setProgress(progress);
}
});
Thread.sleep(50);
}
runOnUiThread(new Runnable(){
@Override public void run(){
myProgressBar.setProgress(0);
}
});
}
catch(InterruptedException ex){}
}
}.start();
Es hat perfekt funktioniert.
Ich werde mich in der nächsten Zeit mehr mit Threads beschäftigen, vielleicht verstehe ich dann ungefähr wie das prinzip dahinter ist.
Ich bin dir wirklich sehr dankbar! Vielen Dank :)
LG
Mich würde es übrigens auch freuen wenn du meine Freundschaftsanfrage annimmst ^^
Vielen Dank erstmal für deine Antwort!
Also, ich verstehe so ziemlich was du meinst, jedoch verstehe ich nicht ganz wo ich einstellen könnte wie lange dieser Prozess dauert, ist die 2500 bei "Thread.sleep" die Hälfte von 5000 Millisekunden?
LG, fishgamer
ist die 2500 bei "Thread.sleep" die Hälfte von 5000 Millisekunden?
In der Tat.
Um das ganze mal etwas aufzudröseln:
- Ein Thread wird gestartet, in dem eine for-Schleife die Zählerstände 0, 50 und 100 annimmt.
- Mittels eines Runnables wird im UI-Thread ein Stück Code aufgerufen, das den Status der ProgressBar aktualisiert (Zugriffe auf UI-Elemente müssen im UI-Thread erfolgen).
- Der Thread wartet 2500ms.
Übrigens, ich will nicht dass sich auf einmal die Hälfte der progressbar füllt und dann sie voll wird, sondern dass das alles gleichmäßig und ohne stocken sich füllt