SeekBar.onProgressChanged()重复触发问题求助:拖动至最小位置时循环调用
解决SeekBar onProgressChanged重复触发的循环问题
嘿,这个问题我之前也踩过坑!核心原因是你在onProgressChanged回调里调用seek.setProgress(min)时,会再次触发这个回调方法,直接形成了无限循环:当用户把滑块拖到0(小于你设定的最小值1),你调用setProgress(1),这会再次触发onProgressChanged;如果此时用户的拖动手势还没结束,或者系统同步状态时又把进度拉回0,就会反复触发0和1的交替日志,要是加了业务逻辑肯定会出问题。
最简单的修复方案
我们要利用onProgressChanged的第三个参数boolean fromUser——这个参数用来区分当前的进度变化是用户手动拖动触发的,还是代码调用setProgress触发的。我们只需要在判断条件里加上fromUser的校验,只有用户手动操作时才执行最小值修正:
public class MainActivity extends AppCompatActivity { SeekBar seek; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seek=(SeekBar) findViewById(R.id.myseek); seek.setMax(20); seek.setProgress(1); seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int min=1; // 只处理用户手动触发的进度变更,避免代码触发回调导致循环 if(fromUser && progress < min){ seek.setProgress(min); } Toast.makeText(getApplicationContext(), Integer.toString(progress), Toast.LENGTH_SHORT).show(); Log.i("test",Integer.toString(progress)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } }
更优雅的进阶方案(API 26+)
如果你开发的应用目标是Android 8.0(API 26)及以上,其实可以直接用系统提供的setMin()方法来设置SeekBar的最小值,这样系统会自动限制滑块的拖动范围,根本不需要手动在回调里做判断:
// 替换原来的seek.setProgress(1),改成这两行 seek.setMin(1); seek.setProgress(1); // 设置初始进度为最小值
这样用户根本拖不到1以下,自然不会出现循环触发回调的问题,代码也更简洁。
内容的提问来源于stack exchange,提问作者rachit3dev
相关产品推荐
相关产品推荐

