ProgressBar mit einem countdowntimer - Android
Ich habe einen 20-Sekunden-countdown-timer erfolgreich arbeiten, mein trivia-Spiel. Ich möchte hinzufügen ProgressBar
(nicht ProgressDialog
) auf dem Bildschirm aus. Ich fand die Entwickler-guide für Android verwirrend. Ich gegoogelt viele Beispiele und versucht, Sie zu kombinieren in meinem code. Jetzt alles, das angezeigt wird, wenn ich ein Spiel auszuführen, ist eine leere bar mit keine "Fortschritte" gemacht, bei jeder Frage des Spiels.
QuestionView.java
public class QuestionView extends Activity {
int correctAnswers = 0;
int wrongAnswers = 0;
int answer = 0;
int i = 0;
long score = 0;
long startTime = 20000;
long interval = 1000;
long points;
boolean timerHasStarted = false;
String category;
Button answer1, answer2, answer3, answer4;
TextView question, pointCounter, questionNumber, timeCounter;
ArrayList<Question> queries;
Timer cdTimer;
ProgressBar bar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.questionviewmain);
answer1 = (Button)findViewById(R.id.answer1);
answer2 = (Button)findViewById(R.id.answer2);
answer3 = (Button)findViewById(R.id.answer3);
answer4 = (Button)findViewById(R.id.answer4);
question = (TextView)findViewById(R.id.question);
category = getIntent().getStringExtra("category");
queries = getIntent().getParcelableArrayListExtra("queries");
pointCounter = (TextView)findViewById(R.id.timer);
questionNumber = (TextView)findViewById(R.id.timeElapsedView);
timeCounter = (TextView)findViewById(R.id.timeCounter);
cdTimer = new Timer(startTime, interval);
bar = (ProgressBar)findViewById(R.id.progressbar);
bar.setIndeterminate(false);
bar.setMax(9);
loadQuestion();
}
public void loadQuestion() {
bar.setProgress(i);
if(i == 10) {
endQuiz();
} else {
if(!timerHasStarted) {
cdTimer.start();
timerHasStarted = true;
} else {
cdTimer.start();
timerHasStarted = false;
}
answer = queries.get(i).getCorrectAnswer();
question.setText(queries.get(i).getQuery());
answer1.setText(queries.get(i).getA1());
answer2.setText(queries.get(i).getA2());
answer3.setText(queries.get(i).getA3());
answer4.setText(queries.get(i).getA4());
answer1.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
queries.get(i).setSelectedAnswer(0);
if(answer == 0) {
correctAnswers++;
nextQuestion();
} else {
wrongAnswers++;
nextQuestion();
}
}
});
answer2.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
queries.get(i).setSelectedAnswer(1);
if(answer == 1) {
correctAnswers++;
nextQuestion();
} else {
wrongAnswers++;
nextQuestion();
}
}
});
answer3.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
queries.get(i).setSelectedAnswer(2);
if(answer == 2) {
correctAnswers++;
nextQuestion();
} else {
wrongAnswers++;
nextQuestion();
}
}
});
answer4.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
queries.get(i).setSelectedAnswer(3);
if(answer == 3) {
correctAnswers++;
nextQuestion();
} else {
wrongAnswers++;
nextQuestion();
}
}
});
}
}
public ArrayList<Question> getQueries() {
return queries;
}
public void nextQuestion() {
score = score + points;
i++;
loadQuestion();
}
public class Timer extends CountDownTimer {
public void startCountdownTimer() {
}
public Timer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onFinish() {
if(i >= 9) {
cdTimer.cancel();
endQuiz();
} else {
wrongAnswers++;
nextQuestion();
}
}
@Override
public void onTick(long millisUntilFinished) {
timeCounter.setText("Time remaining: " + (millisUntilFinished / 100));
points = (millisUntilFinished / 100) / 2;
pointCounter.setText("Points remaining: " + points);
if(i < 10) {
questionNumber.setText("Question " + (i + 1) + " of 10");
}
}
}
public void endQuiz() {
Intent intent = new Intent(QuestionView.this, Results.class);
intent.putExtra("correctAnswers", correctAnswers);
intent.putExtra("wrongAnswers", wrongAnswers);
intent.putExtra("score", score);
intent.putParcelableArrayListExtra("queries", queries);
intent.putExtra("category", category);
startActivity(intent);
}
}
XML-code
<ProgressBar
android:id="@+id/progressbar"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:visibility="visible"
style="@android:style/Widget.ProgressBar.Horizontal" />
InformationsquelleAutor Matt | 2013-02-11
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Neue Antwort
Um dies zu tun fügen wir eine neue Zeile zu
onTick()
:(Müssen Sie möglicherweise zu zwicken die Daten-Typen, ich bin Weg von meinem compiler... Auch ich weiß nicht, wie die Countdown-Timers Klasse, es ist ungenau und oft überspringt die vorletzte Zahl. Ich schrieb eine Alternative Klasse hier: android CountDownTimer - zusätzliche Millisekunden Verzögerung zwischen ticks)
Ursprüngliche Antwort
Ich habe ein paar Hinweise:
Haben Sie einen maximalen Wert für Ihre ProgressBar?
Schlage ich vor, laden
i
als Fortschritt, statt den Konstanten Wert von 10:Wenn Sie immer noch nicht sehen keine Fortschritte sicherzustellen, dass Sie nicht im unbestimmten Modus:
(Dies wird vorausgesetzt, dass Sie eine ProgressBar kann zeigen Fortschritte.)
Neben
Bewegen Sie diesen code in
onCreate()
:Dann verschieben Sie diese Zeile an
loadQuestion()
:Sonst der Fortschritt wird nie aktualisiert werden, da Sie nur eine Countdown-Timers und, die Sie eigentlich nie nennen
startCountdownTimer()
.ProgressBar
wird nur noch ein tick voller jedes mal, wenn eine Frage beantwortet wird. Was ich Suche ist für dieProgressBar
zu langsam tick nach unten, bis die 20 Sekunden, die der Benutzer zugeteilt ist, die für jede Frage verschwunden ist. Wenn dieProgressBar
Zecken den ganzen Weg hinunter zu leeren, wird die nächste Frage geladen wird mit einem neuen fullProgressBar
. Ich entschuldige mich, wenn ich war zu ungenau in meinem Eröffnungs-posting.bar.setProgress(i)
zubar.setProgress((int) millisUntilFinished)
und steckte es in dieonTick()
Methode. Danke An Sam!