【问题标题】:ProgressBar with a countdowntimer - Android带有倒数计时器的 ProgressBar - Android
【发布时间】:2013-01-26 21:51:51
【问题描述】:

我有一个 20 秒的倒数计时器成功地运行我的琐事游戏。我想在屏幕上添加一个ProgressBar(不是ProgressDialog)。我发现 Android 的开发人员指南令人困惑。我在 Google 上搜索了很多示例,并尝试将它们组合到我的代码中。现在,当我运行游戏时显示的只是一个空栏,在游戏的每个问题中都没有“进展”。

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 代码

<ProgressBar 
                android:id="@+id/progressbar"
                android:layout_height="wrap_content" 
                android:layout_width="wrap_content"
                android:visibility="visible" 
                style="@android:style/Widget.ProgressBar.Horizontal" />

【问题讨论】:

    标签: java android progress-bar countdowntimer


    【解决方案1】:

    我正在寻找的是让 ProgressBar 缓慢下降,直到为每个问题分配给用户的 20 秒时间消失。

    新答案
    为此,让我们在onTick() 中添加一个新行:

    bar.setProgress((int) Math.round(millisUntilFinished / 1000.0));
    

    (您可能需要调整数据类型,我远离我的编译器......另外我不喜欢 CountDownTimer 类,它不准确并且经常跳过倒数第二个数字。我在这里写了一个替代类:android CountDownTimer - additional milliseconds delay between ticks)


    原答案
    我有几个指针:

    • 您是否为 ProgressBar 定义了最大值?

      bar.setMax(9);
      
    • 我建议加载i作为进度而不是10这个常量:

      bar.setProgress(i);
      
    • 如果您仍然没有看到任何进展,请确保您没有处于不确定模式:

      bar.setIndeterminate(false);
      

      (这里假设您使用的 ProgressBar 可以depict progress。)


    加法
    将此代码移至onCreate()

    bar = (ProgressBar)findViewById(R.id.progressbar);
    bar.setIndeterminate(false); // May not be necessary
    bar.setMax(9);
    

    然后将此行移至loadQuestion():

    bar.setProgress(i);
    

    否则进度将永远不会更新,因为您只创建了一个 CountDownTimer 并且您从未真正调用过startCountdownTimer()

    【讨论】:

    • 我已经编辑了我的代码以反映您上面的 3 个要点。结果是一样的。至于括号语句,我不熟悉,所以我不知道答案。我可能得先研究一下。
    • 好的,请发布您的 Progessbar XML。 (是直线还是圆?)
    • 新代码给出了不同的结果,但并不完全符合我的要求。现在,每回答一个问题,ProgressBar 就会多一个勾号。我正在寻找的是让ProgressBar 慢慢下降,直到为每个问题分配给用户的 20 秒时间消失。如果ProgressBar 一直打到空,则下一个问题将加载一个新的完整ProgressBar。如果我在开场白中过于含糊,我深表歉意。
    • 我成功了!除了我将bar.setProgress(i) 更改为bar.setProgress((int) millisUntilFinished) 并将其放入onTick() 方法之外,我做了你建议的所有事情。谢谢山姆!
    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2013-09-12
    • 2021-03-29
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多