web-dev-qa-db-ja.com

Android SeekBar setOnSeekBarChangeListener

Android SeekBars OnSeekBarChangeListener。特に、onProgressChangedメソッドは、シークバーの最初と最後のタッチに対してのみ通知されますか?

SeekBarの現在の進行状況を表示するTextViewを更新しようとしています。ただし、TextViewは最初のタッチと最後のタッチで更新されます。これをデバッグすると、このメソッドが2回だけ呼び出されるという私の仮定が確認されます。(.

要するに、私は小さな進捗の変化ごとに呼び出される進捗リスナーを取得する可能性を探しています。

35
user1162729

これがあなたの助けになることを願っています:

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

    }       
});             
77

onProgressChanged()は、最初と最後のタッチ(onStartTrackingTouch()およびonStopTrackingTouch()メソッドがある理由)だけでなく、進行状況が変更されるたびに呼び出す必要があります。

SeekBarに複数の値があること、つまり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) {}

    }

さらなるヘルプのために、いくつかのコードとログ結果を共有してください。

12
GalDude33

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

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

そのため、textViewは進行状況を表示し、シークバーが移動している場合は常に変更する必要があります。

5
EarlOfEgo

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

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


    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) {


    }

    @Override
    public void onStopTrackingTouch(SeekBar arg0) {


    }
2
Sajan

すべての答えは正しいですが、最初に長い大きな脂肪数をタイマーに変換する必要があります。

    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)));        
}
2
S.R