2014-01-23 29 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),並且它不改變我的onClick下方的countTime。

任何幫助,非常感謝。如果可以附上解釋,那會很棒!

謝謝大家提前!

編輯:我猜測它的範圍問題,即時通訊俯瞰??編輯2:如果它是一個範圍問題,我有點困惑,以至於如何能夠重置「lastPressedButton」變量設置它,而不是countTime。

+0

您正在您的OnCreate()方法中創建倒數計時器,該方法將使用此時「countTime」的值。想象一下你在那個時候通過了一個常數。您需要使用所需的countTime在onClick方法中創建countDownTimer。 – Larry

+0

Java使用按值傳遞,所以當您將'countTime'傳遞給'CountDownTimer'構造函數時,您只傳遞該值。它不保留對它來自的變量的任何引用。看看這個API,它看起來並不像CountDownTimer提供的任何方法在運行時更新時間。您可能必須創建一個新的,並在用戶界面中進行替換。 –

回答

1

Java通過值語義傳遞,而不是通過引用傳遞,構造時的countTime值傳遞給CountDownTimer,CDT在實例化後不會看到countTime的任何更新。