Android-Quiz-Spiel - Countdown-timer für jede qstion
Habe ich eine Quiz-app für Android mit dem tutorial hier: http://automateddeveloper.blogspot.co.uk/2011/06/getting-started-complete-android-app.html
Für jede Frage nur 20 Sekunden zu beantworten. Wenn er/Sie nicht zu beantworten in 20 Sekunden, ein AlertDialog
popup und das Spiel wird beendet.
Um dies zu tun, ich habe einen Zähler in der OnCreate
Methode der QuestionActivity class
:
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();
}
Der Zähler funktioniert anzeigen und Funktionen auf dem Bildschirm korrekt ist. Nach der Beantwortung einer Frage, die Aktivität bewegt sich auf die nächste Frage, und der Zähler setzt sich nach 20 Sekunden wieder.
Das problem
Quiz mit 15 Fragen, die nach Beantwortung von 3 oder 4 Fragen, die app stürzt ab und ich bekomme die folgende Fehlermeldung:
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?
Ich glaube, das bezieht sich auf die AlertDialog
. Ich habe mir dieser Fehler-code auf Stackoverflow und die beliebte Lösung ist die übergabe ActivityName.this
wie der Kontext bei der Erstellung des AlertDialog
.
Leider ist dies nicht das problem lösen.
Ich glaube der Zähler ist die Festlegung einer Frist von 20 Sekunden für die gesamte Aktivität. Meine Forderung ist 20 Sekunden für jede Frage.
Jedoch, wird der Zähler zurückgesetzt auf 20 Sekunden, wenn der Benutzer drücken Sie die' Next
- Taste und die Aktivität bewegt sich auf die nächste Frage stellen.
Soll ich werden setzt den Zähler zurück, wenn der Benutzer drückt die Next
- Taste? Hier ist die OnClickListener
code für die Next
Taste
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();
Kann mir jemand helfen code eine Lösung für mein problem?
Hier ist der gesamte code, der in QuestionActivity.class
public class QuestionActivity extends SherlockActivity implements
OnClickListener {
private Question currentQ;
private GamePlay currentGame;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.question);
getSupportActionBar().hide();
/**
* Configure current game and get question
*/
currentGame = ((ChuckApplication) getApplication()).getCurrentGame();
currentQ = currentGame.getNextQuestion();
Button nextBtn = (Button) findViewById(R.id.nextBtn);
nextBtn.setOnClickListener(this);
Button quitBtn = (Button) findViewById(R.id.quitBtn);
quitBtn.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
finish();
}
});
//Update the question and answer options..
setQuestions();
final TextView myCounter = (TextView) findViewById(R.id.countdown);
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();
}
public void timeUp(Context context) {
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();
}
/**
* Method to set the text for the question and answers from the current
* games current question
*/
private void setQuestions() {
//set the question text from current question
String question = Utility.capitalise(currentQ.getQuestion()) + "?";
TextView qText = (TextView) findViewById(R.id.question);
qText.setText(question);
//set the available options
List<String> answers = currentQ.getQuestionOptions();
TextView option1 = (TextView) findViewById(R.id.answer1);
option1.setText(Utility.capitalise(answers.get(0)));
TextView option2 = (TextView) findViewById(R.id.answer2);
option2.setText(Utility.capitalise(answers.get(1)));
TextView option3 = (TextView) findViewById(R.id.answer3);
option3.setText(Utility.capitalise(answers.get(2)));
TextView option4 = (TextView) findViewById(R.id.answer4);
option4.setText(Utility.capitalise(answers.get(3)));
}
public void onClick(View arg0) {
//validate a checkbox has been selected
if (!checkAnswer())
return;
//check if end of game
if (currentGame.isGameOver()) {
Intent i = new Intent(this, EndgameActivity.class);
startActivity(i);
finish();
} else {
Intent i = new Intent(this, QuestionActivity.class);
startActivity(i);
finish();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* Check if a checkbox has been selected, and if it has then check if its
* correct and update gamescore
*/
private boolean checkAnswer() {
String answer = getSelectedAnswer();
if (answer == null) {
//Log.d("Questions", "No Checkbox selection made - returning");
return false;
} else {
//Log.d("Questions",
//"Valid Checkbox selection made - check if correct");
if (currentQ.getAnswer().equalsIgnoreCase(answer)) {
//Log.d("Questions", "Correct Answer!");
currentGame.incrementRightAnswers();
} else {
//Log.d("Questions", "Incorrect Answer!");
currentGame.incrementWrongAnswers();
}
return true;
}
}
private String getSelectedAnswer() {
RadioButton c1 = (RadioButton) findViewById(R.id.answer1);
RadioButton c2 = (RadioButton) findViewById(R.id.answer2);
RadioButton c3 = (RadioButton) findViewById(R.id.answer3);
RadioButton c4 = (RadioButton) findViewById(R.id.answer4);
if (c1.isChecked()) {
return c1.getText().toString();
}
if (c2.isChecked()) {
return c2.getText().toString();
}
if (c3.isChecked()) {
return c3.getText().toString();
}
if (c4.isChecked()) {
return c4.getText().toString();
}
return null;
}
InformationsquelleAutor tiptopjat | 2012-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass die Tätigkeit nicht mehr existiert, an einem bestimmten Punkt, wenn Sie versuchen, das Dialogfeld(wahrscheinlich wenn die
CountDownTimer
ist in der Nähe des Ende?!?).Glaub ich eh finishing und ab die gleiche Aktivität für jede Frage, ist nicht so eine gute Idee, stattdessen können Sie mit der aktuellen Aktivität und einfach den timer neu starten. Zum Beispiel:
und in der
onClick
Rückruf das gleiche tun, um das setup eine neue Frage ist, stoppen Sie den old timer und starten Sie den neuen timer:Auch in der callback für den
Dialog
'sButton
ich würde erstmal in der Nähe derDialog
vor Beendigung derActivity
:Ich habe alle Ihre Codes und des Zähler-problem wurde behoben. Allerdings, wenn das quiz vorbei ist, und ich beginnen EndgameActivity.class nach 20 Sekunden bekomme ich einen WindowManager$BadTokenException Fehler. Wie es aussieht, ist der timer noch laufen und versuchen zum anzeigen der AlertDialog. Ich bin mit finish() nach dem Start des EndgameActivity Aktivität. Irgendwelche Ideen was ich falsch mache?
Fügen Sie den gleichen code, um den timer zu stoppen, für den Fall, wenn das Spiel vorbei ist:
if (currentGame.isGameOver()) { if (mCountDown != null) { mCountDown.cancel(); } ...
und sehen, ob es löst das Problem.Problem gelöst! Danke. Ich habe nur ein Problem jetzt. In meiner ursprünglichen Lösung, die radio-buttons für jede Frage sollte alle deaktiviert werden, wenn ein Umzug in eine neue Frage. Nach der Implementierung Ihrer Lösung, die radio-button ausgewählt aus der vorherigen Frage noch ausgewählt ist, in der nächsten Frage...
Behoben durch hinzufügen von
radioGroup.clearCheck()
am AnfangsetQuestions()
Methode.InformationsquelleAutor Luksprog