SeekBar未正确递增

时间:2016-11-15 10:38:25

标签: java android seekbar

我正在使用一个非常简单的Android应用来使用SeekBar转换温度。

有2个搜索条,一个用于选择摄氏温度,另一个用于选择华氏温度。它们都在代码中初始化如下:

private SeekBar celsiusSeekbar;
private TextView celsiusValueText;
private SeekBar fahrenheitSeekBar;
private TextView fahrenheitValueText;
private ArrayList<Integer> fahrenheitProgress;
private ArrayList<Integer> celsiusProgress;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    this.celsiusSeekbar = (SeekBar) findViewById(R.id.celsius_seekbar);
    this.fahrenheitSeekBar = (SeekBar) findViewById(R.id.fahrenheit_seekbar);
    this.celsiusValueText = (TextView) findViewById(R.id.celsius_value);
    this.fahrenheitValueText = (TextView) findViewById(R.id.fahrenheit_value);

    this.initCelsiusProgress();
    this.celsiusSeekbar.setMax(200);
    this.celsiusSeekbar.setProgress(100);
    this.celsiusValueText.setText("0°C");
    this.celsiusSeekbar.incrementProgressBy(1);
    this.celsiusSeekbar.setOnSeekBarChangeListener(new CelsiusSeekBarChangedListener());

    this.initFahrenheitProgress();
    this.fahrenheitSeekBar.setMax(360);
    this.fahrenheitSeekBar.setProgress(180);
    this.fahrenheitSeekBar.incrementProgressBy(1);
    this.fahrenheitValueText.setText("32°F");
    this.fahrenheitSeekBar.setOnSeekBarChangeListener(new FahrenheitSeekBarChangedListener());
}

private void initFahrenheitProgress() {
    fahrenheitProgress = new ArrayList<>();
    for(int i = 0; i <= 360; i++)
        fahrenheitProgress.add(i, i - 148);
}

private void initCelsiusProgress(){
    celsiusProgress = new ArrayList<>();
    for(int i = 0; i <= 200; i++)
        celsiusProgress.add(i, i - 100);
}

private int convertCelsiusProgressToValue(int progress){ return celsiusProgress.get(progress); }

private int convertFahrenheitProgressToValue(int progress){ return fahrenheitProgress.get(progress); }

private class CelsiusSeekBarChangedListener implements SeekBar.OnSeekBarChangeListener {

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        System.out.println("progress : " + progress + " | seekbar progresss : " + seekBar.getProgress());
        //Update celsius temperature
        celsiusValueText.setText(convertCelsiusProgressToValue(progress) + "°C");

        //Update fahrenheit temperature
        fahrenheitValueText = (TextView) findViewById(R.id.fahrenheit_value);
        int value = (int) (convertCelsiusProgressToValue(progress) * 1.8 + 32);
        fahrenheitValueText.setText(value + "°F");
        fahrenheitSeekBar.setProgress(fahrenheitProgress.indexOf(new Integer(value)));
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {}

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {}

}

private class FahrenheitSeekBarChangedListener implements SeekBar.OnSeekBarChangeListener {

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        //Update fahrenheit temperature
        fahrenheitValueText.setText(convertFahrenheitProgressToValue(progress) + "°F");

        //Update celsius temperature
        celsiusValueText = (TextView) findViewById(R.id.celsius_value);
        int value = (int) ((convertFahrenheitProgressToValue(progress)-32) / 1.8);
        celsiusValueText.setText(value + "°C");
        celsiusSeekbar.setProgress(celsiusProgress.indexOf(new Integer(value)));
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {}

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {}

}

第一个搜索条(摄氏温度)在0°C和-17°C之间递增1,但随后它增加5并且我不明白为什么。这是一个小gif来向您展示问题:GIF

我希望搜索栏每次都增加一个。

如果有人有想法解释为什么它不能正常工作,我将非常感激!

1 个答案:

答案 0 :(得分:0)

我知道这里可能有什么问题。当您移动摄氏度栏时,fahrenheitSeekBar.setProgress(fahrenheitProgress.indexOf(new Integer(value)));最后会调用此栏,并立即调用onProgressChanged中的FahrenheitListener(然后调用celsiusBar.setProgress()并开始圈子)。

我建议在

中包装两个侦听器(onProgressChanged方法)
if(fromUser){
  //your whole listener
}

fromUser如果用户在应用中进行更改,则为true,因此以编程方式进行的更改将被忽略。