下午好,

我正在寻找一个可以在整个应用程序中更改的通用变量,并将其传递给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。

任何帮助是极大的赞赏。如果可以附上解释,那就太好了!

提前谢谢大家!

编辑:我猜这是我忽略的范围问题?

EDIT2:如果这是一个范围问题,那么我对如何重置“ lastPressedButton”变量设置(而不是重置countTime)有点困惑。

最佳答案

Java具有按值传递语义,而不是按引用传递语义,构造时将countTime的值传递给CountDownTimer,实例化后CDT看不到countTime的任何更新。

08-04 20:38