Android SeekBar setOnSeekBarChangeListener

时间:2012-01-21 20:02:45

标签: android seekbar

我想知道android SeekBars OnSeekBarChangeListener的行为。特别是onProgressChanged方法是否仅针对搜索栏上的第一次和最后一次触摸进行通知?

我正在尝试刷新应该显示SeekBar当前进度的TextView。但TextView只是在第一次触摸和最后一次触摸时更新。调试这证实了我的假设,即这个方法被调用两次:(我想要的是TextView显示SeekBar中的每个进度变化。

简而言之:我正在寻找一种能够获得进步监听器的可能性。每次进步都会有所改变。

6 个答案:

答案 0 :(得分:75)

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

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();

    }       
});             

答案 1 :(得分:12)

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) {}

    }

请分享一些代码和日志结果以获得更多帮助。

答案 2 :(得分:5)

每次移动光标时都会调用

onProgressChanged。

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

因此textView应该显示进度并在移动搜索条时始终更改。

答案 3 :(得分:2)

覆盖所有方法

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


    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) {


    }

    @Override
    public void onStopTrackingTouch(SeekBar arg0) {


    }

答案 4 :(得分:2)

所有答案都是正确的,但您需要先将长大的胖号转换为计时器:

    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)));        
}

答案 5 :(得分:0)

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) {

            }
        });