我的onProgressChanged() - 当我以编程方式设置SeekBar的进度时,事件不会被触发,但是当我实际移动SeekBar滑块时,它确实被解雇了。
我希望在使用setProgress()时触发事件 - Android Developer Reference甚至声明:
public abstract void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser)
通知进度级别已更改。客户端可以使用fromUser参数来区分用户启动的更改与以编程方式发生的更改。
我的项目中的一些代码段:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
final SeekBar mySeekBar = ((SeekBar) findViewById(R.id.mySeekBar));
mySeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
// Do some stuff
}
}
}
@Override
protected void onResume() {
super.onResume();
final SeekBar mySeekBar = ((SeekBar) findViewById(R.id.mySeekBar));
mySeekBar.setProgress(someValue); // This SHOULD trigger onProgressChanged(), but it doesn't...
}
答案 0 :(得分:7)
+1 Romuald Brunet的答案:
这是我修复它的“黑客”:
<SeekBar android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="1"
android:max="200" />
注意progress =“1”,将布局中的默认进度设置为1,然后在我的代码中,当我实际将其默认为0时,将发生进度更改并触发onProgressChanged()事件。
答案 1 :(得分:6)
刚刚遇到同样的问题。
在我的情况下,onProgressChanged
没有因为值实际上没有改变而被解雇。我设置的值与当前值(0
:)
(我的代码没有任何问题)
答案 2 :(得分:1)
SeekBar.OnSeekBarChangeListener.onProgressChanged
仅在实际更改进度时调用,不一定在调用setProgress
时调用 - 仅当新进度与上一进度不同时才会发生。
查看扩展the source of SeekBar的AbsSeekBar,ProgressBar又延伸{{3}},我们可以看到对setProgress()
的调用不会触发onProgressChanged()
除非新进展与前一进展有所不同,如下文所示。
/*
Snippet from ProgressBar.java
*/
public void setProgress(int progress, boolean animate) {
setProgressInternal(progress, false, animate);
}
synchronized boolean setProgressInternal(int progress, boolean fromUser, boolean animate) {
if (mIndeterminate) {
// Not applicable.
return false;
}
progress = MathUtils.constrain(progress, mMin, mMax);
if (progress == mProgress) {
// No change from current.
return false;
}
mProgress = progress;
refreshProgress(R.id.progress, mProgress, fromUser, animate);
return true;
}
答案 3 :(得分:1)
您需要确保该值确实已更改,否则它将不会被提取。放入2行。第一不想。第二个想要的。
seekbar.setProgress(7); // Necessary to force the change to desired
seekbar.setProgress(50); // Desired progress
答案 4 :(得分:0)
在xml文件中设置progress = 10,如下所示:
<SeekBar android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="10"
android:max="100" />
然后在主文件中编写以下代码:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
seekbar.setProgress(50)
}
}, 100);
减少延迟,以免影响用户界面。
答案 5 :(得分:0)
一种可能的解决方法是创建自己的扩展Seekbar的窗口小部件并根据您的需要实现两种方法:
private OnSeekBarChangeListener onSeekBarChangeListener;
@Override
public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
super.setOnSeekBarChangeListener(l);
onSeekBarChangeListener = l;
}
@Override
public void setProgress(int progress) {
super.setProgress(progress);
if (onSeekBarChangeListener != null) {
onSeekBarChangeListener.onProgressChanged(this, progress, false);
}
}
答案 6 :(得分:0)
被接受的答案对我不起作用,因为当以编程方式将进度设置为1时,它不再被解雇(这是相同的错误)。
我要做的是自己调用onProgressChanged()。我的搜索栏是成员变量。
void setProgressValue(int progress){
if(progress == 0){ //the default progress is 0. if i set it to 0 again the call back wont be invoked
mSeekBar.setProgress(progress);
onProgressChanged(progress,mSeekBar,false);
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//things to be done when the call back is received
}
发布,希望以后能有所帮助。
答案 7 :(得分:0)
我的监听器没有触发,因为我在设置监听器之前正在呼叫setProgress()
答案 8 :(得分:-1)
我可以肯定地确认setProgress
适用于Android版本6.0.1。
另一个StackOverflow answer说这是一个错误。如果这是真的,那肯定不再是这样了。
此代码适用于我的测试设置:
@Override
public void onResume() {
super.onResume();
SeekBar seekBar = (SeekBar)findViewById(R.id.seek_bar);
seekBar.setProgress(seekBar.getProgress());
}
正如预期的那样,SeekBar
&#39; s OnSeekBarChangeListener
正在被调用。
要进行故障排除,请确保使用setOnSeekBarChangeListener()
正确设置侦听器,并确保实现接口功能。
其他SO答案似乎表明您只应从UI线程调用setProgress()
。 This answer显示了如何做到这一点。
答案 9 :(得分:-1)
只需致电
mySeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
int i= arg0.getProgress();
//youre seekbar.setProgress(i);
}
}