Android Chronometer点击暂停存储时长比对后弹出Toast实现问题
解决方案
改动说明
你只需要在现有的pauseChronometer暂停方法里补充时长判断逻辑即可,不用修改其他已有功能:
- 暂停计时后通过已存储的
pauseOffset直接获取累计的计时毫秒数 - 把毫秒转为秒后匹配阈值区间,弹出对应的Toast提示
- 为了方便后续维护,我们把阈值和对应提示整理成数组,避免写大量重复的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
相关产品推荐
相关产品推荐

