You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android问答应用Java实现单题倒计时及切换重置方法

实现每题独立倒计时的问答应用(Java Activity版)

嘿,作为Android开发新手,想要搞定每道题对应独立倒计时、切换题目自动重置的功能其实很简单,我给你梳理清楚步骤,再配上完整代码示例,一看就懂~

核心思路

咱们用Android自带的CountDownTimer类来实现倒计时——这个类会帮我们处理时间递减、UI更新的逻辑,不用自己手动管理线程或者Handler。关键是每切换一道题,就取消当前正在运行的倒计时,然后重新创建并启动一个新的倒计时实例,这样就能保证每题的倒计时都是独立的。

具体实现步骤

1. 先写布局文件(activity_main.xml)

咱们需要几个基础控件:显示倒计时的文本、显示题目的文本、切换下一题的按钮。示例布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center">

    <!-- 倒计时显示 -->
    <TextView
        android:id="@+id/tv_countdown"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="30"
        android:textSize="48sp"
        android:textColor="#FF5722"
        android:layout_marginBottom="32dp"/>

    <!-- 题目显示 -->
    <TextView
        android:id="@+id/tv_question"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="第一题:Android中CountDownTimer的作用是什么?"
        android:textSize="20sp"
        android:layout_marginBottom="32dp"/>

    <!-- 切换下一题按钮 -->
    <Button
        android:id="@+id/btn_next_question"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="下一题"/>

</LinearLayout>

2. 编写Activity逻辑(MainActivity.java)

这里要做的事情:初始化题目列表、管理倒计时实例、切换题目时重置倒计时。代码里我加了详细注释,你跟着看就行:

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // 倒计时时长(每题30秒,单位毫秒)
    private static final long COUNTDOWN_DURATION = 30 * 1000;
    // 倒计时更新间隔(每秒更新一次UI)
    private static final long COUNT_INTERVAL = 1000;

    private TextView tvCountdown;
    private TextView tvQuestion;
    private Button btnNextQuestion;

    // 当前运行的倒计时实例,用来切换题目时取消旧的倒计时
    private CountDownTimer currentCountDownTimer;
    // 当前题目索引
    private int currentQuestionIndex = 0;
    // 题目列表,你可以自己扩展更多题目
    private String[] questions = {
            "第一题:Android中CountDownTimer的作用是什么?",
            "第二题:Activity的生命周期有哪几个阶段?",
            "第三题:什么是Intent?它的作用是什么?",
            "第四题:RecyclerView和ListView的区别是什么?"
    };

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

        // 初始化控件
        tvCountdown = findViewById(R.id.tv_countdown);
        tvQuestion = findViewById(R.id.tv_question);
        btnNextQuestion = findViewById(R.id.btn_next_question);

        // 启动第一道题的倒计时
        startCountdown();

        // 切换下一题的点击事件
        btnNextQuestion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 切换到下一题索引,循环展示
                currentQuestionIndex = (currentQuestionIndex + 1) % questions.length;
                // 更新题目文本
                tvQuestion.setText(questions[currentQuestionIndex]);
                // 重置倒计时:先取消旧的,再启动新的
                resetCountdown();
            }
        });
    }

    /**
     * 启动倒计时的方法
     */
    private void startCountdown() {
        // 创建新的倒计时实例
        currentCountDownTimer = new CountDownTimer(COUNTDOWN_DURATION, COUNT_INTERVAL) {
            @Override
            public void onTick(long millisUntilFinished) {
                // 每秒更新倒计时文本,把毫秒转成秒
                long secondsLeft = millisUntilFinished / 1000;
                tvCountdown.setText(String.valueOf(secondsLeft));
            }

            @Override
            public void onFinish() {
                // 倒计时结束后的逻辑:比如自动跳转到下一题,或者提示超时
                tvCountdown.setText("时间到!");
                // 这里可以自动触发下一题,和点击按钮逻辑一致
                currentQuestionIndex = (currentQuestionIndex + 1) % questions.length;
                tvQuestion.setText(questions[currentQuestionIndex]);
                resetCountdown();
            }
        };
        // 启动倒计时
        currentCountDownTimer.start();
    }

    /**
     * 重置倒计时的方法:取消旧的,启动新的
     */
    private void resetCountdown() {
        // 先判断当前倒计时是否存在,如果存在就取消,避免内存泄漏
        if (currentCountDownTimer != null) {
            currentCountDownTimer.cancel();
        }
        // 启动新的倒计时
        startCountdown();
    }

    /**
     * Activity销毁时,一定要取消倒计时,防止内存泄漏
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (currentCountDownTimer != null) {
            currentCountDownTimer.cancel();
        }
    }
}

关键注意点

  • 及时取消倒计时:切换题目时、Activity销毁时,一定要调用cancel()方法,不然倒计时会一直在后台运行,导致内存泄漏或者UI异常。
  • 独立实例化:每道题都要创建新的CountDownTimer实例,不能复用旧的,因为CountDownTimer启动后无法重置,只能取消后重新创建。
  • 自定义时长:你可以修改COUNTDOWN_DURATION变量,设置每题的倒计时时长,比如改成60秒就是60*1000

这样一套下来,你的问答应用就能实现每题独立倒计时,切换题目自动重置的功能啦!

内容的提问来源于stack exchange,提问作者jane

火山引擎 最新活动