2017-01-04 1 views
0

Я создал приложение секундомера, и когда я его протестировал, я заметил проблему, которая заключается в том, что секундомер сбрасывается до нуля после нажатия кнопки паузы. (когда пользователь нажимает кнопку запуска после того, как он остановил кнопку, секундомер начинается с нуля). Вот мой код:Мой секундомер сбрасывается до нуля после нажатия кнопки паузы, что может быть неправильным в моем коде?

TextView tv; 
EditText laps_editText; 
Button btnstart, btnreset; 
int a, b, c, d, e, f; 
String splString, diffString; 
long split, diff, firstsplit = 0; 
int t = 1; 
long startTime = 0; 
long timeInMilis = 0; 
long timeSwap = 0; 
long updatedtime = 0; 
int sec = 0, min = 0, hr = 0; 
int secs = 0, mins = 0, hrs = 0; 
int secspl = 0, minspl = 0, hrspl =0; 
Handler handler = new Handler(); 
boolean isRunning = false; 
String spl, dif; 
int counter = 1; 
ScrollView scrollView; 
Button changeColor; 
int selectedColor, savedColor; 
SharedPreferences backGroundColor = null; 
Context context; 
RelativeLayout rLayout; 
int n = 0; 
SharedPreferences current = null; 
long oldReciver; 

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_stop_watch, container, false); 
     laps_editText = (EditText) v.findViewById(R.id.lap_edittext); 

     rLayout = (RelativeLayout) v.findViewById(R.id.r_layout); 
     context = getActivity().getApplicationContext(); 
     tv = (TextView) v.findViewById(R.id.textView2); 



     btnstart = (Button) v.findViewById(R.id.button3); 
     btnreset = (Button) v.findViewById(R.id.button4); 

     btnstart.setTypeface(custom_font); 
     btnreset.setTypeface(custom_font); 
     changeColor = (Button) v.findViewById(R.id.changeColor); 

     // As you see I tried to use sharedpreferences to save the updatedtime variable that was before the user pressed the pause button 
     current = context.getSharedPreferences("currentMil", Context.MODE_PRIVATE); 

     savedColor = backGroundColor.getInt("color", 38536); 
     rLayout.setBackgroundColor(savedColor); 



     btnstart.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
// if the t == 1 the button will start the stopwath else it will stop it 
        if(t == 1){ 
          oldReciver = current.getLong("updated", 00); 
          isRunning = true; 
          btnstart.setText("Pause"); 
          btnreset.setText("Lap"); 
          startTime = SystemClock.uptimeMillis() + oldReciver; 
          t = 0; 
          handler.postDelayed(updateTimer, 0); 


       } 
       else{ 
        isRunning = false; 
        btnstart.setText("Start"); 
        btnreset.setText("Reset"); 
        timeSwap += timeInMilis; 
        handler.removeCallbacks(updateTimer); 
        n = 1; 
        t = 1; 
       } 
      } 
     }); 
     btnreset.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       /* if(isRunning){ 
        split = SystemClock.uptimeMillis() - startTime; 
        secspl = (int)(split/1000); 
        minspl = sec/60; 
        hrspl = min/60; 
        secspl = sec % 60; 

        if (firstsplit == 0){ 
         diff = split; 
         secs = (int)(diff/1000); 
         mins = sec/60; 
         hrs = min/60; 
         secs = sec % 60; 
         firstsplit = split; 
        } 
        else{ 
         diff = split - firstsplit; 
         secs = (int)(diff/1000); 
         mins = sec/60; 
         hrs= min/60; 
         secs = sec % 60; 
         firstsplit = split; 
        } 
        dif = String.valueOf(hrs) + ":" + String.valueOf(mins) + ":" + String.valueOf(secs); 
        spl = String.valueOf(hrspl) + ":" + String.valueOf(minspl) + ":" + String.valueOf(secspl); 




       } 
ignore those lines above they are just for laps 
*/ 
        else{ 
         startTime = 0; 
         t = 1; 
         timeInMilis = 0; 
         timeSwap = 0; 
         sec = 0; 
         min = 0; 
         hr = 0; 
         updatedtime = 0; 
         laps_editText.setText(""); 
         btnstart.setText("Start"); 
         handler.removeCallbacks(updateTimer); 
         tv.setText("00:00:00"); 
         n = 1; 
         counter = 1; 
        } 
       } 
       public String getDiff(){ 
        return dif; 
       } 
       public String getSpl(){ 
        return spl; 
       } 

      }); 


      return v; 

     } 

public Runnable updateTimer = new Runnable() { 
     @Override 
     public void run() { 
      timeInMilis = SystemClock.uptimeMillis() - startTime; 
      updatedtime = timeSwap + timeInMilis; 
// here i,m tring to save updatetime value 
      SharedPreferences.Editor editor = current.edit(); 
      editor.putLong("updated", updatedtime); 
      editor.commit(); 
      sec = (int)(updatedtime/1000); 
      min = sec/60; 
      hr = min/60; 
      sec = sec % 60; 
      tv.setText(String.format("%02d", hr) + ":" + String.format("%02d", min) + ":" + String.format("%02d", sec) ); 
      handler.postDelayed(this, 0); 
     } 
    }; 

Любая помощь ?!

EDIT 1: Я просто добавил длинную переменную «до паузы», которая равна нулю и вычисляет разницу во времени с момента, когда пользователь нажал кнопку запуска кнопки и кнопку паузы, и она решила проблему.

+0

Кто-нибудь понял, что может быть неправильным? –

+0

Прочитайте это http://stackoverflow.com/help/mcve – nerdlyist

ответ

0

У вас нет кнопки Pause. Вы просто меняете текст своей кнопки Start на «Пауза». Итак, каждый раз, когда вы нажимаете «Пауза», вы действительно просто щелкаете Start. Если вы хотите на самом деле «Пауза», вы либо должны положить в реальной Pause кнопки, или запустить проверку, чтобы увидеть содержимое кнопки, когда она нажата:

long currTime = 0; 
if (btnStart.Text == "Start") 
{ 
    if (timeStart == 0;) 
     timer.Start(); 
    else if (timeStart > 0) 
     timeStart = currTime; 
} 
else if (btnStart.Text == "Pause") 
{ 
    timer.Pause(); 
    currTime = timeStart; 
} 

Я не могу тебя видеть повторно код здесь, но вы должны иметь Start(), который увеличивает startTime и ваш Reset() должен установить startTime обратно в 0.

Это не точно. Просто руководство о том, как вы должны подходить к нему. Это не должно быть безумно сложным - на самом деле, если это так, вы, вероятно, ошибаетесь. Проще лучше!

+0

Но в моем коде я проверяю переменную t, которую я объявил, чтобы сделать "" ДЕЛАТЬ ЭТО ", И ДЕЛАТЬ, ЧТО это проблема? –

+0

Да. у меня не будет выделенных кнопок, вам нужно проверить содержимое кнопок для выполнения указанных действий. Я немного изменю свой ответ. Проверьте это. –

1

Я не вижу, где определена переменная oldReceiver и каков ее тип. Возможно, происходит какое-то литье, которое приводит к нулю.

Хорошей практикой было бы определить имя свойства как «постоянное».

Возможно, было бы лучше проверить ярлык кнопки, чтобы решить, приостановлено ли это или начать щелчок.

+0

oldReceiver - длинная переменная, я добавлю переменную declartions. –

+0

Не могли бы вы попытаться добавить 'current = context.getSharedPreferences (" currentMil ", Context.MODE_PRIVATE);' к вашему определению Runnable? –

Смежные вопросы