SeekBar 未正确递增
SeekBar is not incremented properly
我正在开发一个非常简单的 Android 应用程序来使用 SeekBar 转换温度。
有 2 个搜索栏,一个是 select 摄氏温度,另一个是 select 华氏温度。它们都在代码中初始化如下:
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
我希望搜索栏每次都加一。
如果有人能解释为什么它不能正常工作,我将不胜感激!
我知道这里可能出了什么问题。当你移动你的摄氏度条时,fahrenheitSeekBar.setProgress(fahrenheitProgress.indexOf(new Integer(value)));
在最后调用它,并立即调用 FahrenheitListener
中的 onProgressChanged
(然后调用 celsiusBar.setProgress()
并且圆圈开始).
我建议在
中包装两个侦听器(onProgressChanged
方法)
if(fromUser){
//your whole listener
}
如果用户在应用程序中进行更改,fromUser
为真,因此将忽略以编程方式进行的更改。
我正在开发一个非常简单的 Android 应用程序来使用 SeekBar 转换温度。
有 2 个搜索栏,一个是 select 摄氏温度,另一个是 select 华氏温度。它们都在代码中初始化如下:
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
我希望搜索栏每次都加一。
如果有人能解释为什么它不能正常工作,我将不胜感激!
我知道这里可能出了什么问题。当你移动你的摄氏度条时,fahrenheitSeekBar.setProgress(fahrenheitProgress.indexOf(new Integer(value)));
在最后调用它,并立即调用 FahrenheitListener
中的 onProgressChanged
(然后调用 celsiusBar.setProgress()
并且圆圈开始).
我建议在
中包装两个侦听器(onProgressChanged
方法)
if(fromUser){
//your whole listener
}
如果用户在应用程序中进行更改,fromUser
为真,因此将忽略以编程方式进行的更改。