Android:以编程方式设置进度时,不会触发SeekBar onProgressChanged事件

时间:2013-08-23 23:28:27

标签: android seekbar

我的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...
}

10 个答案:

答案 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 SeekBarAbsSeekBarProgressBar又延伸{{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);
    }
}