2012-01-21 13 views
30

Me pregunto acerca del comportamiento del android SeekBars OnSeekBarChangeListener. En particular, ¿se notifica el método onProgressChanged solo para el primer y el último toque en la barra de búsqueda?Android SeekBar setOnSeekBarChangeListener

Estoy tratando de actualizar un TextView que debe mostrar el progreso actual de SeekBar. Pero el TextView se acaba de actualizar con el primer toque y el último toque. Depurar esto confirma mi suposición de que este método se llama solo dos veces :(Lo que me gustaría es que TextView muestre cada cambio de progreso en SeekBar.

En resumen: estoy buscando la posibilidad de obtener un oyente de progreso que se llama para cada pequeño cambio progreso.

Respuesta

3

onProgressChanged se llama cada vez que se mueve el cursor.

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

por lo Textview debe mostrar el progreso y alterar siempre si la barra de búsqueda se está moviendo.

11

onProgressChanged() debe invocarse en cada progreso modificado, no solo en el primer y último toque (por eso tiene los métodos onStartTrackingTouch() y onStopTrackingTouch()).

Asegúrese de que su SeekBar tenga más de 1 valor, es decir, su MAX> = 3.

En su onCreate:

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

Su oyente:

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

    } 

favor comparta algo de código y los resultados del registro de ayuda Furter.

66

espero que esto le ayudará a:

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

Además ... publicar lo que equivale al mismo fragmento de código varias veces dentro del mismo marco de tiempo se considera un poco spam también. – Kev

+0

¡Muy útil y fácil de implementar! – Triforcey

+0

¿Se puede hacer esto a través de XML? No puedo encontrar un atributo para eso. –

2

Anulación de todos los métodos

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


    } 

    @Override 
    public void onStartTrackingTouch(SeekBar arg0) { 


    } 

    @Override 
    public void onStopTrackingTouch(SeekBar arg0) { 


    } 
2

Todas las respuestas son correctas, pero hay que convertir un número grande y gordo durante mucho tiempo en un temporizador primero:

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

Y así es como lo usa:

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