2016-11-15 8 views
0

私は非常にシンプルなAndroidアプリケーションを使ってSeekBarを使って温度を変換しています。SeekBarが正しくインクリメントされていません

2つのシークバーがあり、1つは摂氏で温度を選択し、もう1つは温度を華氏で選択します。どちら以下のようにコードで初期化されている:

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

} 

第(摂氏温度用)バーを求め°C C 0°と-17インクリメントされるが、それは5とIドンだけインクリメントされます理由を理解できない。問題を示すためのちょっとした情報があります:GIF

毎回シークバーを1つ増やしたいと思います。

誰かが正しく動作しない理由を説明するアイデアがあれば、とても感謝しています。

+1

一緒に結ばれていますか?リスナーを私たちに教えてください。 – Shadov

+0

スニペットにリスナーを追加しました。シークバーは実際には結ばれていませんが、単に摂氏と華氏の間の変換があります。シークバーは変換を行うために異なる最大値を持ち、シークバーの位置はより簡単に管理できます。 –

答えて

0

私はここで何が間違っているのか考えています。摂氏バーを動かすと、最後にfahrenheitSeekBar.setProgress(fahrenheitProgress.indexOf(new Integer(value)));が呼び出され、すぐにonProgressChangedFahrenheitListenerに呼び出されます(celsiusBar.setProgress()が呼び出され、円が始まります)。

私はアプリで、

if(fromUser){ 
    //your whole listener 
} 

fromUserユーザーが変更を行う場合にtrueになるには、両方のリスナー(onProgressChangedメソッド)をラップすることをお勧め、プログラム的に作られたので、変更はつもり無視されています。

+0

大きなことありがとう、それは問題でした! –

関連する問題