2012-01-21 21 views
30

アンドロイドのSeekBars OnSeekBarChangeListenerの動作が不思議です。特に、シークバーの最初と最後のタッチについてのみ通知されるonProgressChangedメソッドはありますか?Android SeekBar setOnSeekBarChangeListener

SeekBarの現在の進行状況を示すTextViewをリフレッシュしようとしています。しかし、TextViewは最初のタッチと最後のタッチで更新されます。これをデバッグすることで、このメソッドがちょうど2回呼び出されるという私の前提が確認されています:TextViewがSeekBar内のすべての進捗の変更を表示することです。それは、どんな小さな進歩の変更のために呼ばれている。

答えて

3

onProgressChangedは、カーソルを移動するたびに呼び出されます。

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

ので、TextViewには、進行状況を示すべきであるとシークバーが移動している場合は、必ず変更してください。

11

onStartTrackingTouch()メソッドとonStopTrackingTouch()メソッドを持っている理由)最初と最後のタッチだけでなく、すべての進捗状況にonProgressChanged()を呼び出す必要があります。

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

    } 

furterの助けのためのいくつかのコードとログの結果を共有してください。

66

私は、これはあなたを助けることを願っています:

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

    }  
});    
+3

また、同じ時間枠内に同じコードスニペットを複数回転記することは、少しスパムとみなされます。 – Kev

+0

非常に便利で実装が簡単です! – Triforcey

+0

これはXMLで行うことができますか?私はそれの属性を見つけることができません。 –

2

オーバーライドすべてのメソッド

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


    } 

    @Override 
    public void onStartTrackingTouch(SeekBar arg0) { 


    } 

    @Override 
    public void onStopTrackingTouch(SeekBar arg0) { 


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