等待倒数计时器完成或用户点击按钮

时间:2014-05-29 19:40:16

标签: android timer

我正在尝试创建一个迷你游戏循环,用户有10秒钟点击按钮或输掉游戏。当我运行while游戏循环时,我希望while循环启动计时器,然后等待计时器用完或用户单击按钮。此外,当代码运行时,应用程序在while循环中崩溃。不知道如何继续。

我对android很新。 提前谢谢。

public class MainGame extends Activity implements OnClickListener {

ProgressBar progress1;

Boolean gameon = true;

Button option1;
Button option2;
Button option3;

private CountDownTimer countDownTimer;
private final long startTime = 10*1000;
private final long interval= 100;




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

                    Log.d("Mark", "justCreated Completed");

    initializebuttons();//also initializes timer, buttons, text, etc.
                    Log.d("Mark", "Initialize Buttons Function Completed");
    maingameloop();




    //Drawable draw = getResources().getDrawable(R.drawable.custom_progress_bar);
    //progress1.setProgressDrawable(draw);
}


private void initializebuttons(){

    option1 = (Button) findViewById(R.id.buttonchoice1);
    option1.setOnClickListener(this);
    option2 = (Button) findViewById(R.id.buttonchoice2);
    option2.setOnClickListener(this);
    option3 = (Button) findViewById(R.id.buttonchoice3);
    option3.setOnClickListener(this);

    countDownTimer = new MyCountDownTimer (startTime, interval);

    Log.d("Mark", "Inside the initialize buttons function");

}

private void maingameloop(){
    while (gameon){

        Log.d("Mark", "while loop running");
        countDownTimer.start();

    }
}

public class MyCountDownTimer extends CountDownTimer {
    public MyCountDownTimer(long startTime, long interval){
        super (startTime, interval);
        synchronized(this){

        }

    }

    @Override
    public void onFinish() {
        option1.setBackgroundColor(getResources().getColor(R.color.LightGreen));

    }

    @Override
    public void onTick(long millisUntilFinished) {


    }
}

@Override
public void onClick(View v) {

    switch(v.getId()){

    case R.id.buttonchoice1:
        break;
    case R.id.buttonchoice2:
        break;
    case R.id.buttonchoice3:

    default:
        break;

    }


}


}

2 个答案:

答案 0 :(得分:0)

我想我得到了你的意思,如果有的话,试试这个

而不是initializeButtons(),执行

countDownTimer = new MyCountDownTimer (startTime, interval);
countDownTimer.start();

然后在CountDownTimer的onStart()中调用initializeButtons();

private void initializebuttons(){

    option1 = (Button) findViewById(R.id.buttonchoice1);
    option1.setOnClickListener(this);
    option2 = (Button) findViewById(R.id.buttonchoice2);
    option2.setOnClickListener(this);
    option3 = (Button) findViewById(R.id.buttonchoice3);
    option3.setOnClickListener(this);

    Log.d("Mark", "Inside the initialize buttons function");

}

在onClick(View v)中,假设答案和按钮文本相同

if(v.getText().toString().equals(answer)){
     // do what you would do if you win
     win = true;               // win is a private class boolean I've created for you
     countDownTimer.cancel();
}

然后在onFinish()

if(!win){
   // do what you want for a loss
}

这将使您确定是否在限制内单击了按钮。如果是这样你赢了,如果不是你输了。这不完全基于您的代码,但可以修改为可以工作。

答案 1 :(得分:0)

有了这个

 while (gameon){

    Log.d("Mark", "while loop running");
    countDownTimer.start();

}

您将运行代码

countDownTimer.start(); 

每次迭代我都确定不是你想要的东西。您根本不需要(想要?)while loop。只需在需要时启动计时器,然后在onFinish()运行您想要在时间用完时运行的代码,并将此代码也放在Button点击中。显然你可以将这一切都放在一个函数中,并从onFinish()onClick()或其他任何东西调用该函数。

我还建议检入onClick()或运行代码的方法取消计时器并将其初始化为null