安卓SeekBar setOnSeekBarChangeListener

46

我想了解android SeekBars OnSeekBarChangeListener的行为。特别是,onProgressChanged方法只在触摸到seekbar的第一次和最后一次时通知吗?

我试图刷新一个TextView,该TextView应显示SeekBar的当前进度。但是,TextView仅在第一次触摸和最后一次触摸时更新。调试确认我的假设,该方法仅被调用两次:( 我希望TextView显示SeekBar中的每个进度更改。

简而言之: 我正在寻找一种可能性,以获得在每个小进度更改时都会调用的进度监听器。

6个回答

101

我希望这能对你有所帮助:

final TextView t1=new TextView(this); 
t1.setText("Hello Android");        
final SeekBar sk=(SeekBar) findViewById(R.id.seekBar1);     
sk.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {       

    @Override       
    public void onStopTrackingTouch(SeekBar seekBar) {      
        // TODO Auto-generated method stub      
    }       

    @Override       
    public void onStartTrackingTouch(SeekBar seekBar) {     
        // TODO Auto-generated method stub      
    }       

    @Override       
    public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {     
        // TODO Auto-generated method stub      

        t1.setTextSize(progress);
        Toast.makeText(getApplicationContext(), String.valueOf(progress),Toast.LENGTH_LONG).show();

    }       
});             

3
同样的代码片段在同一时间内发布多次被认为是有些垃圾邮件的行为。请注意避免这种情况。 - Kev
这可以通过 XML 完成吗?我找不到对应的属性。 - Kartik Chugh

14

在每次进度变化时都应该调用onProgressChanged(),而不仅仅是在第一次和最后一次触摸时调用(这就是为什么你需要onStartTrackingTouch()和onStopTrackingTouch()方法的原因)。

确保你的SeekBar具有超过1个值,也就是说你的MAX>=3。

在你的onCreate中:

 yourSeekBar=(SeekBar) findViewById(R.id.yourSeekBar);
 yourSeekBar.setOnSeekBarChangeListener(new yourListener());

你的监听器:

private class yourListener implements SeekBar.OnSeekBarChangeListener {

        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
                            // Log the progress
            Log.d("DEBUG", "Progress is: "+progress);
                            //set textView's text
            yourTextView.setText(""+progress);
        }

        public void onStartTrackingTouch(SeekBar seekBar) {}

        public void onStopTrackingTouch(SeekBar seekBar) {}

    }
请分享一些代码和日志结果以获取进一步的帮助。

8

每次移动光标时,onProgressChanged都会被调用。

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    textView.setText(String.valueOf(new Integer(progress)));        
}

所以textView应该显示进度,并且在seekbar被移动时始终更改。

4

所有的答案都是正确的,但是你首先需要将一个长而庞大的数字转换成一个计时器:

    public String toTimer(long milliseconds){
    String finalTimerString = "";
    String secondsString;
    // Convert total duration into time
    int hours = (int)( milliseconds / (1000*60*60));
    int minutes = (int)(milliseconds % (1000*60*60)) / (1000*60);
    int seconds = (int) ((milliseconds % (1000*60*60)) % (1000*60) / 1000);
    // Add hours if there
    if(hours > 0){
        finalTimerString = hours + ":";
    }
    // Prepending 0 to seconds if it is one digit
    if(seconds < 10){
        secondsString = "0" + seconds;
    }else{
        secondsString = "" + seconds;}
    finalTimerString = finalTimerString + minutes + ":" + secondsString;
    // return timer string
    return finalTimerString;
}

以下是如何使用它的方法:

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
textView.setText(String.format("%s", toTimer(progress)));        
}

2

覆盖所有方法

    @Override
    public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {


    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) {


    }

    @Override
    public void onStopTrackingTouch(SeekBar arg0) {


    }

1

当我们第一次初始化时,SeekBar 会调用 onProgressChanged 方法。我们可以使用以下代码跳过这个过程。我们需要检查它自动初始化时返回的布尔值是否为 false。

volumeManager.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                if(b){
                    mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接