我使用以下教程创建了Android测验应用:http://automateddeveloper.blogspot.co.uk/2011/06/getting-started-complete-android-app.html
对于每个问题,用户只有20秒的时间来回答它。如果他/她在20秒内未能回答,则会弹出AlertDialog
,游戏将终止。
为此,我在OnCreate
的{{1}}方法中添加了一个计数器:
QuestionActivity class
计数器在屏幕上正常显示和功能。在回答问题后,活动转到下一个问题,计数器再次重置为20秒。
问题
测验有15个问题,在回答3或4个问题后,应用程序崩溃,我收到以下错误:
final TextView myCounter = (TextView) findViewById(R.id.countdown);
new CountDownTimer(20000, 1000) {
@Override
public void onFinish() {
timeUp();
}
@Override
public void onTick(long millisUntilFinished) {
myCounter.setText("Time left: "
+ String.valueOf(millisUntilFinished / 1000));
}
}.start();
public void timeUp() {
AlertDialog.Builder builder = new AlertDialog.Builder(
QuestionActivity.this);
builder.setTitle("Times up!")
.setMessage("Game over")
.setCancelable(false)
.setNeutralButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
QuestionActivity.this.finish();
}
});
AlertDialog alert = builder.create();
alert.show();
}
我认为这与07-18 00:49:05.530: E/AndroidRuntime(4867): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@41533a80 is not valid; is your activity running?
有关。我在Stackoverflow上查找了这个错误代码,流行的解决方案是在构建AlertDialog
时将ActivityName.this
作为上下文传递。
不幸的是,这并没有解决问题。
我相信计数器正在为整个活动设置20秒的时间限制。我的要求是每个问题20秒。
但是,当用户按下“AlertDialog
按钮并且活动移至下一个问题时,计数器将重置为20秒。
当用户按下Next
按钮时,我应该重置计数器吗?以下是Next
按钮
OnClickListener
代码
Next
任何人都可以帮我编写解决问题的方法吗?
以下是if (currentGame.isGameOver()) {
Intent i = new Intent(this, EndgameActivity.class);
startActivity(i);
finish();
} else {
Intent i = new Intent(this, QuestionActivity.class);
startActivity(i);
SHOULD I ADD SOMETHING HERE?
finish();
QuestionActivity.class
答案 0 :(得分:6)
我认为当你尝试进行对话时,活动在某个时刻不再存在(可能是在CountDownTimer
接近结束时?!?)。
无论如何,我认为为每个问题完成并开始相同的活动并不是一个好主意,而是可以使用当前活动并简单地重启计时器。例如:
public class QuestionActivity extends SherlockActivity implements
OnClickListener {
private CountDownTimer mCountDown;
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
mCountDown = new CountDownTimer(20000, 1000) {
@Override
public void onFinish() {
// myCounter.setText("Time up!");
timeUp(context);
}
@Override
public void onTick(long millisUntilFinished) {
myCounter.setText("Time left: "
+ String.valueOf(millisUntilFinished / 1000));
}
}.start();
// ...
并在onClick
回调中设置新问题,停止旧计时器并重新启动新计时器:
//check if end of game
if (currentGame.isGameOver()) {
Intent i = new Intent(this, EndgameActivity.class);
startActivity(i);
finish();
} else {
if (mCountDown != null) {
mCountDown.cancel();
}
currentQ = currentGame.getNextQuestion();
setQuestions();
mCountDown = new CountDownTimer(20000, 1000) {
@Override
public void onFinish() {
// myCounter.setText("Time up!");
timeUp(context);
}
@Override
public void onTick(long millisUntilFinished) {
myCounter.setText("Time left: "
+ String.valueOf(millisUntilFinished / 1000));
}
}.start();
}
此外,在Dialog
Button
的回调中,我会在完成Dialog
之前关闭Activity
:
((AlertDialog) dialog).dismiss();
QuestionActivity.this.finish();