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

Poker BlindTimer App

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von JmasterJ, 30.03.2010.

  1. JmasterJ, 30.03.2010 #1
    JmasterJ

    JmasterJ Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    30.03.2010
    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
     
  2. JmasterJ, 03.04.2010 #2
    JmasterJ

    JmasterJ Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    30.03.2010
    Weiß denn keiner wo der Fehler in meinem Code liegt? :(:(:(
     
  3. TheFlatz|Veit, 03.04.2010 #3
    TheFlatz|Veit

    TheFlatz|Veit Android-Hilfe.de Mitglied

    Beiträge:
    54
    Erhaltene Danke:
    3
    Registriert seit:
    29.09.2009
    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).
     
  4. JmasterJ, 06.04.2010 #4
    JmasterJ

    JmasterJ Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    30.03.2010
    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!
     
  5. JmasterJ, 17.06.2010 #5
    JmasterJ

    JmasterJ Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    30.03.2010
    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));
                }
        
    }}
    
     

Diese Seite empfehlen