2014-01-23 2 views
1

Добрый день,Присвоить обобщенная переменная, как долго CountDownTimer

Ищу назначить общую переменную, которая может быть изменена по всему приложению и переходила в CountDownTimer, как мой длинный

package com.rcd.learningactivities; 

import java.text.DecimalFormat; 
import java.util.concurrent.TimeUnit; 

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

public class MainActivity extends Activity { 

    protected CountDownTimer cd; 
    private long countTime = 0; // Variable for CountDownTimer 
    private Button lastPressedButton; 
    private Button red; 
    private Button blue; 
    private TextView blueTimer; 
    private TextView redTimer; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     blueTimer = (TextView) findViewById(R.id.blueTimer); 
     blue = (Button) findViewById(R.id.button1); 

     redTimer = (TextView) findViewById(R.id.redTimer); 
     red = (Button) findViewById(R.id.button2); 


     cd = new CountDownTimer(countTime, 1000) { //<--- trying to use countTime here 

      public void onTick(long millisUntilFinished) { 
        DecimalFormat dfmin = new DecimalFormat("0"); 
        DecimalFormat dfsec = new DecimalFormat("00"); 
        double seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished)%60; 
        double min = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished); 
        if (lastPressedButton == blue){ 
         blueTimer.setText(String.valueOf(dfmin.format(min)) + ":" + String.valueOf(dfsec.format(seconds))); 
        } 
        else if (lastPressedButton == red) { 
         redTimer.setText(String.valueOf(dfmin.format(min)) + ":" + String.valueOf(dfsec.format(seconds))); 
        } 

      } 

      public void onFinish() { 
        if (lastPressedButton == blue){ 
         blueTimer.setText("5:00"); 
        } 
        else if (lastPressedButton == red){ 
         redTimer.setText("5:00"); 
        } 
       } 
      }; 

     blue.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       lastPressedButton = blue; 
       countTime = 300000; // <-- setting countTime here 
       if (blueTimer.getText().toString().contains("5:00")){ 
        cd.start(); 

       } else { 
        cd.cancel(); 
        cd.onFinish(); 
       } 

      } 
     }); 

     red.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       lastPressedButton = red; 
       countTime = 250000; 
       if (redTimer.getText().toString().contains("5:00")){ 
        cd.start(); 
       } else { 
        cd.cancel(); 
        cd.onFinish(); 
       } 

      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

По какой-то причине , он остается с первоначально объявленным номером 0 (или если я изменяю его, чтобы сказать 300000, тогда его всегда 300000) и его не меняет countTime ниже в моем onClick.

Любая помощь с благодарностью. Если это может сопровождаться объяснением, это было бы здорово!

Спасибо всем заранее!

РЕДАКТИРОВАТЬ: Я предполагаю, что это проблема с объемом, которую я пропускаю?

EDIT2: Если это проблема с областью видимости, то немного запутался в том, как им можно сбросить переменную «lastPressedButton», установленную примерно по ней, но не countTime.

+0

Вы создаете таймер обратного отсчета в методе OnCreate(), который будет использовать то, что когда-либо значение «countTime» в данный момент. Представьте, что вы проходили в постоянной точке. Вам нужно будет создать countDownTimer в ваших методах onClick с требуемым countTime. – Larry

+0

Java использует pass by value, поэтому, когда вы передаете 'countTime' в конструктор' CountDownTimer', вы передаете значение только. Он не сохраняет ссылки на переменную, из которой он пришел. Если посмотреть на API, то не похоже, что CountDownTimer предоставляет любой способ обновления времени после его запуска. Вам, вероятно, придется создать новый и заменить его в пользовательском интерфейсе. –

ответ

1

Java имеет пропуск по семантике значения, а не по ссылке, значение countTime при конструировании передается CountDownTimer, CDT не видит никаких обновлений в countTime после того, как он был создан.

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