Poker BlindTimer App

J

JmasterJ

Neues Mitglied
3
Hallo, ich schreibe gerade an einem App als BlindTimer. Soweit funktioniert es auch, allerdings Startet der Zähler erst beim zweiten Klick auf den Button und sagt vorher schon "done".

Ich vermute das hängt damit zusammen das der Timer beim Start nicht direkt die eingegebene Zahl einliest, sondern erst mit dem wert "0" arbeitet. Auf weitere Klicks reagiert es dann normal, allerdings zieht der erste fehler folgefehler nach sich, wie z.b. das auf dem Button dann schon "Pause" statt "Start" steht.
Das ist aber logisch wenn er vorher nen anderen wert nimmt als den eingegebenen.

Hier der Code, hoffe mir kann jemand helfen!

BlindTimer.java

Code:
package de.blindtimer;

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class BlindTimer extends Activity {

  TextView timeDisplay;
  MyCount counter;
  
  int state = 0;
  int zw;
  int length;
  long startTime = 0;
  long currentTime = 0;
  long timeElapsed = 0;
  long timeRemaining = 0;
  long prevTimeRemaining = 0;
  Button control;
  EditText edit;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    timeDisplay = (TextView) findViewById(R.id.timer);
    edit = (EditText) findViewById(R.id.Textfeld);
    control = (Button) findViewById(R.id.control);
    
    counter = new MyCount(length, 100);
  }
  
  public int berechne(int a){
      int min = a * 60;
      int sec = min * 1000;
      return sec;
  }

  public void control(View view) {
    switch (state) {
    case 0:
      zw = Integer.parseInt(edit.getText().toString());
      length = berechne(zw);
      startTime = System.currentTimeMillis();
      counter.start();
      control.setText(R.string.pause);
      state = 1;
      break;
    case 1:
      // pause
      currentTime = System.currentTimeMillis();
      timeElapsed = currentTime - startTime;
      if (prevTimeRemaining == 0)
        timeRemaining = length - timeElapsed;
      else
        timeRemaining = prevTimeRemaining - timeElapsed;
      counter.cancel();
      timeDisplay.setText("Left: " + formatTime(timeRemaining));
      control.setText(R.string.resume);
      prevTimeRemaining = timeRemaining;

      // resume
      counter = new MyCount(timeRemaining, 100);
      state = 0;
      break;
    case 2:
      prevTimeRemaining = 0;
      counter = new MyCount(length, 100);
      control.setText(R.string.start);
      timeDisplay.setText(R.string.timer);
      state = 0;
    }
    
  }
  public String formatTime(long millis) {
      String output = "00:00:00";
      long seconds = millis / 1000;
      long minutes = seconds / 60;
      long hours = minutes / 60;

      seconds = seconds % 60;
      minutes = minutes % 60;
      hours = hours % 60;

      String secondsD = String.valueOf(seconds);
      String minutesD = String.valueOf(minutes);
      String hoursD = String.valueOf(hours); 

      if (seconds < 10)
        secondsD = "0" + seconds;
      if (minutes < 10)
        minutesD = "0" + minutes;
      if (hours < 10)
        hoursD = "0" + hours;

      output = hoursD + " : " + minutesD + " : " + secondsD;
      return output;
    }
  
  public class MyCount extends CountDownTimer {

    public MyCount(long millisInFuture, long countDownInterval) {
      super(millisInFuture, countDownInterval);
    }

    public void onFinish() {
        timeDisplay.setText("done!");
      state = 2;
     control.setText(R.string.restart);
    }

    public void onTick(long millisUntilFinished) {
      timeDisplay.setText("Left: " + formatTime(millisUntilFinished));
    }
    
   

  }
}

main.xml

Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
    <EditText android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center" android:id="@+id/Textfeld" android:text="10"></EditText><TextView    
    android:id="@+id/timer"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:textSize="20sp"
    android:padding="10sp"
  />
  <Button
    android:id="@+id/control"
    android:text="@string/start"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:onClick="control"
    android:padding="20sp"
  ></Button>

</LinearLayout>

strings.xml

Code:
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="hello">Hello World, Countdown!</string>
  <string name="app_name">Countdown</string>
  <string name="start">Start</string>
  <string name="pause">Pause</string>
  <string name="resume">Resume</string>
  <string name="restart">Restart</string>
  <string name="timer">Left: 100</string>
</resources>

Wäre super wenn einer das geradebiegen könnte, ich find den Fehler einfach nicht und hab das einlesen der "lenght" -Variable schon fast überall hin geschoben! :(

Greetz
 
Weiß denn keiner wo der Fehler in meinem Code liegt? :(:(:(
 
na was ich hier auf den ersten blick sehe, ist dass du die variable length erst berechnest wenn du das countdown-objekt schon instanziiert hast.
dementsprechend arbeit die app das erste mal mit 0 (du übergibst length vor der berechnung in den konstruktor).
 
Hey VIELEN VIELEN DANK :D

das wars, hab das counter objekt dann auch erst im case 0 erzeugt dann klappts genau wie Du gesagt hast!

Danke dafür!
 
Hallo, ich habe schon wieder ein Problem mit der App,

Der Timer läuft wenn ich start drücke perfekt.

Wenn ich stop drück stoppt er auch und sollte dann wenn man nochmal auf start drückt wieder weiterlaufen wo er aufgehört hat.

Starte ich bei 2 Min und Stoppe bei 1:50 dann geht das, aber wenn ich wieder auf Start drücke dann startet er bei 1:41.

Sieht jemand den Grund im Code?

Code:
package de.jan.poker;

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Timer extends Activity {
    
    Button Bstart;
    Button Bstop;
    Button Breset;
    Button Bback;
    TextView TVtimer;
    MyCount counter;
      int zw1;
      int zw2;
      int length1;
      int length2;
      int flength;
      int state = 0;
      long startTime = 0;
      long currentTime = 0;
      long timeElapsed = 0;
      long timeRemaining = 0;
      long prevTimeRemaining = 0;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.timer);
        
        Bstart = (Button)findViewById(R.id.Bstart);
        Bstop = (Button)findViewById(R.id.Bstop);
        Breset = (Button)findViewById(R.id.Breset);
        Bback = (Button)findViewById(R.id.Bback);
        TVtimer = (TextView)findViewById(R.id.TVtimer);
        
        zw1 = getIntent().getExtras().getInt("m");
        zw2 = getIntent().getExtras().getInt("s");
        length1 = berechne(zw1);
        length2 = berechne2(zw2);
        flength = length1 + length2;
        counter = new MyCount(flength, 100);
        if (zw1 < 10)
            TVtimer.setText("0" + zw1);
        else TVtimer.setText (String.valueOf(zw1));
        
        if (zw2 < 10)
            TVtimer.append(" : " + "0" + zw2);
        else TVtimer.append(" : " + String.valueOf(zw2));
        
        
        
        
        Bstart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                
            switch (state) {
              case 0:
                  startTime = System.currentTimeMillis();
                  counter.start();
                break;
              case 1:
                  
                if (prevTimeRemaining == 0)
                  timeRemaining = flength - timeElapsed;
                    
                else
                timeRemaining = prevTimeRemaining - timeElapsed;
                
                
                
                
                counter = new MyCount(timeRemaining, 100);
                
                counter.start();
                state = 0;
                  break;
                
                }}});
        
        Bstop.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                
              currentTime = System.currentTimeMillis();
                timeElapsed = currentTime - startTime;
                
                timeRemaining = flength - timeElapsed;
                prevTimeRemaining = timeRemaining;
                counter.cancel();
                TVtimer.setText(formatTime(timeRemaining));
                state = 1;
                
                
                }});
        
        Breset.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                
                counter = new MyCount(flength, 100);
                if (zw1 < 10)
                    TVtimer.setText("0" + zw1);
                else TVtimer.setText (String.valueOf(zw1));
                
                if (zw2 < 10)
                    TVtimer.append(" : " + "0" + zw2);
                else TVtimer.append(" : " + String.valueOf(zw2));
                
                  state = 0;
                
                }});
        
        }
    
        public int berechne(int a){
          int mins = a * 60;
          int secs = mins * 1000;
          return secs;
        }
        
        public int berechne2(int a){
              int secs = a * 1000;
              return secs;
            }
        
        
        public String formatTime(long millis) {
              String output = "00:00";
              long seconds = millis / 1000;
              long minutes = seconds / 60;
              

              seconds = seconds % 60;
              minutes = minutes % 60;
              

              String secondsD = String.valueOf(seconds);
              String minutesD = String.valueOf(minutes);
               

              if (seconds < 10)
                secondsD = "0" + seconds;
              if (minutes < 10)
                minutesD = "0" + minutes;
              

              output = minutesD + " : " + secondsD;
              return output;
            }
        
        public class MyCount extends CountDownTimer {

            public MyCount(long millisInFuture, long countDownInterval) {
              super(millisInFuture, countDownInterval);
            }
            
            public void onFinish() {
                TVtimer.setText("done!");
            }
        
        public void onTick(long millisUntilFinished) {
              TVtimer.setText(formatTime(millisUntilFinished));
            }
    
}}
 

Ähnliche Themen

R
  • Robby1950
2
Antworten
23
Aufrufe
955
Robby1950
R
netfreak
  • netfreak
Antworten
10
Aufrufe
438
netfreak
netfreak
R
  • raller
Antworten
15
Aufrufe
507
DOT2010
DOT2010
Zurück
Oben Unten