You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Chronometer点击暂停存储时长比对后弹出Toast实现问题

解决方案

改动说明

你只需要在现有的pauseChronometer暂停方法里补充时长判断逻辑即可,不用修改其他已有功能:

  1. 暂停计时后通过已存储的pauseOffset直接获取累计的计时毫秒数
  2. 把毫秒转为秒后匹配阈值区间,弹出对应的Toast提示
  3. 为了方便后续维护,我们把阈值和对应提示整理成数组,避免写大量重复的if判断

完整修改后的MainActivity.java代码

package com.example.bobby.chronometer;

import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Chronometer;
import android.widget.Toast;

import static com.example.bobby.chronometer.R.id;
import static com.example.bobby.chronometer.R.layout;

public class MainActivity extends AppCompatActivity {
    private Chronometer chronometer;
    private long pauseOffset;
    private boolean running;
    // 预设阈值(单位:毫秒)和对应的提示文本,按从小到大顺序排列
    private final long[] timeThresholds = {15000L, 30000L, 45000L, 60000L, 90000L, 120000L};
    private final String[] hints = {"Good", "Super", "Extra", "Great", "Amazing", "Awesome"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(layout.activity_main);
        chronometer = findViewById(id.chronometer);
        chronometer.setFormat("(%m,%s)");
        chronometer.setBase(SystemClock.elapsedRealtime());
        // 原有到点自动弹Toast的逻辑,不需要可以直接删除
        chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer chronometer) {
                long elapsedTime = SystemClock.elapsedRealtime() - chronometer.getBase();
                for (int i = 0; i < timeThresholds.length; i++) {
                    if (elapsedTime >= timeThresholds[i] && elapsedTime < timeThresholds[i] + 1000) {
                        Toast.makeText(MainActivity.this, hints[i] + "!", Toast.LENGTH_LONG).show();
                        break;
                    }
                }
            }
        });
    }

    public void startChronometer(View v) {
        if (!running) {
            chronometer.setBase(SystemClock.elapsedRealtime() - pauseOffset);
            chronometer.start();
            running = true;
        }
    }

    public void pauseChronometer(View v) {
        if (running) {
            chronometer.stop();
            pauseOffset = SystemClock.elapsedRealtime() - chronometer.getBase();
            running = false;
            // 新增暂停时判断时长弹出对应Toast的逻辑
            showResultToast(pauseOffset);
        }
    }

    public void resetChronometer(View v) {
        chronometer.setBase(SystemClock.elapsedRealtime());
        pauseOffset = 0;
    }

    // 新增:根据计时时长匹配对应提示的方法
    private void showResultToast(long elapsedMs) {
        String showText = hints[0];
        // 从最大阈值倒序判断,匹配最接近的区间
        for (int i = timeThresholds.length - 1; i >= 0; i--) {
            if (elapsedMs >= timeThresholds[i]) {
                showText = hints[i];
                break;
            }
        }
        Toast.makeText(this, showText, Toast.LENGTH_LONG).show();
    }
}

逻辑说明

  • 匹配规则完全符合需求:计时低于15秒匹配Good,16-29秒匹配Super,以此类推
  • 原有自动到点弹Toast的逻辑做了简化,不需要可以直接删除setOnChronometerTickListener的全部代码,不影响暂停弹提示的功能
  • 后续如果需要新增阈值和提示,只需要往timeThresholds和hints数组里按顺序添加对应值即可,不用修改核心判断逻辑

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 09:27:03