Android开发:SeekBar秒数(i变量)超60时如何重置?代码问题求助
解决SeekBar秒数超过60时的重置问题
嘿,我来帮你搞定这个问题!你现在的代码里有两个关键问题导致重置逻辑不生效,我给你拆解下:
- 分钟变量被重复初始化:每次
onProgressChanged回调触发时,你都把minute重新赋值为0,哪怕之前执行了minute++,下一次回调又会回到0,根本没法累计分钟数。 - 没有对秒数进行重置:你只想着增加分钟数,但完全没处理代表秒数的
i,所以它会一直跟着SeekBar的进度往上走,不会自动回到0。
最优解决方案:用数学计算直接得到分钟和秒数
其实不用维护额外的变量,直接通过除法和取模运算就能准确计算出分钟和剩余秒数,逻辑更简洁也更可靠,哪怕用户直接把SeekBar拖到几百的进度,也能正确显示时间:
SeekBar bar = findViewById(R.id.seekBar2); final TextView textView = findViewById(R.id.textView); bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 总进度除以60,取整数部分就是分钟数 int minute = progress / 60; // 总进度对60取模,得到的就是0-59的秒数(自动实现超过60重置) int second = progress % 60; // 用格式化字符串让秒数显示为两位数(比如5秒显示成05) textView.setText(String.format("%d:%02d", minute, second)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // 这里可以留空,或者加你需要的触摸开始逻辑 } @Override public void onStopTrackingTouch(SeekBar seekBar) { // 这里可以留空,或者加你需要的触摸结束逻辑 } });
如果你想坚持原来的思路(维护分钟变量)
要是你一定要通过维护minute变量来实现,那得把minute定义在回调外面,避免每次被重置,同时还要处理进度减少的情况(比如用户把SeekBar往回拖):
SeekBar bar = findViewById(R.id.seekBar2); final TextView textView = findViewById(R.id.textView); // 把minute放在回调外面,防止每次回调被重置为0 int minute = 0; // 记录上一次的进度,用来判断是否跨分钟边界 int lastProgress = 0; bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 进度增加且跨过60的倍数,分钟数加1 if (progress / 60 > lastProgress / 60) { minute++; } // 进度减少且跨过60的倍数,分钟数减1 else if (progress / 60 < lastProgress / 60) { minute--; } // 计算当前秒数 int second = progress % 60; textView.setText(String.format("%d:%02d", minute, second)); // 更新上一次进度,供下一次判断使用 lastProgress = progress; } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });
不过第一种方法明显更省心,不需要额外维护变量,也不会因为SeekBar的进度跳变出现逻辑错误,推荐用这个方案~
内容的提问来源于stack exchange,提问作者Szymon
相关产品推荐
相关产品推荐

