我想知道android SeekBars OnSeekBarChangeListener的行为。特别是onProgressChanged方法是否仅针对搜索栏上的第一次和最后一次触摸进行通知?
我正在尝试刷新应该显示SeekBar当前进度的TextView。但TextView只是在第一次触摸和最后一次触摸时更新。调试这证实了我的假设,即这个方法被调用两次:(我想要的是TextView显示SeekBar中的每个进度变化。
简而言之:我正在寻找一种能够获得进步监听器的可能性。每次进步都会有所改变。
答案 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) {
}
});