web-dev-qa-db-fra.com

Android SeekBar setOnSeekBarChangeListener

Je m'interroge sur le comportement de la Android SeekBars OnSeekBarChangeListener. En particulier, la méthode onProgressChanged-est notifiée uniquement pour la première et la dernière touche sur la barre de recherche?

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

En bref: je recherche une possibilité d'obtenir un écouteur de progression qui soit appelé pour chaque petit changement de progression.

35
user1162729

J'espère que cela t'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();

    }       
});             
77
Balaji Gunasekar

onProgressChanged () doit être appelé à chaque changement de progression, pas seulement au premier et au dernier toucher (c'est pourquoi vous avez les méthodes onStartTrackingTouch () et onStopTrackingTouch ()).

Assurez-vous que votre SeekBar a plus de 1 valeur, c'est-à-dire 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 du code et les résultats du journal pour plus d'aide.

12
GalDude33

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

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

5
EarlOfEgo

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


    }
2
Sajan

Toutes les réponses sont correctes, mais vous devez d'abord convertir un gros gros chiffre en 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 voici comment vous l'utilisez:

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