45 votes

Android SeekBar setOnSeekBarChangeListener (barre de recherche)

Je m'interroge sur le comportement du SeekBars OnSeekBarChangeListener d'Android. En particulier, la méthode onProgressChanged est-elle notifiée uniquement pour le premier et le dernier contact sur la barre de recherche ?

J'essaie de rafraîchir un TextView qui devrait montrer la progression actuelle de la SeekBar. Mais le TextView n'est mis à jour qu'au premier et au dernier contact. Le débogage confirme mon hypothèse que cette méthode n'est appelée que deux fois :( Ce que j'aimerais, c'est que le TextView affiche chaque changement de progression de la SeekBar.

En bref, je cherche une possibilité d'obtenir un écouteur de progression qui est appelé pour chaque petit changement de progression.

100voto

Balaji Gunasekar Points 315

J'espère que cela vous aidera :

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

    }       
});

14voto

GalDude33 Points 2564

OnProgressChanged() devrait être appelé à chaque changement de progression, et pas seulement à la première et à la dernière touche (c'est pourquoi il existe des méthodes onStartTrackingTouch() et onStopTrackingTouch()).

Assurez-vous que votre SeekBar a plus d'une valeur, c'est-à-dire que votre MAX>=3.

Dans votre onCreate :

 yourSeekBar=(SeekBar) findViewById(R.id.yourSeekBar);
 yourSeekBar.setOnSeekBarChangeListener(new yourListener());

Votre auditeur :

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

    }

Veuillez partager le code et les résultats du journal pour une aide plus approfondie.

8voto

EarlOfEgo Points 1480

OnProgressChanged est appelé chaque fois que vous déplacez le curseur.

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

Ainsi, le textView devrait montrer la progression et changer toujours si la barre de recherche est déplacée.

4voto

S.R Points 1202

Toutes les réponses sont correctes, mais vous devez d'abord convertir un long et gros chiffre en un minuteur :

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

Et c'est ainsi que vous l'utilisez :

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
textView.setText(String.format("%s", toTimer(progress)));        
}

2voto

Sajan Points 668

Remplacer toutes les méthodes

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

    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar arg0) {

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X