2012-01-21 10 views
30

Mi chiedo il comportamento di Android SeekBars OnSeekBarChangeListener. In particolare, il metodo onProgressChanged è notificato solo per il primo e l'ultimo tocco sulla barra di ricerca?Android SeekBar setOnSeekBarChangeListener

Sto tentando di aggiornare un TextView che dovrebbe mostrare l'avanzamento corrente di SeekBar. Ma TextView è appena aggiornato al primo tocco e all'ultimo tocco. Il debugging conferma che questo metodo è chiamato solo due volte :(Quello che mi piacerebbe avere è che TextView mostri ogni cambiamento di avanzamento in SeekBar.

In breve: sto cercando la possibilità di ottenere un listener di progresso che si chiama per ogni piccolo cambiamento progresso.

risposta

3

onProgressChanged viene chiamato ogni volta che si sposta il cursore.

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

così textView dovrebbe mostrare lo stato di avanzamento e alterare sempre se il SeekBar viene spostato.

11

onProgressChanged() dovrebbe essere chiamato su ogni progresso modificato, non solo sul primo e sull'ultimo tocco (ecco perché hai i metodi onStartTrackingTouch() e onStopTrackingTouch()).

Assicurati che il tuo SeekBar abbia più di 1 valore, ovvero il tuo MAX> = 3.

Nel vostro onCreate:

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

vostro ascoltatore:

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

    } 

Si prega di condividere un po 'di codice e il risultato di travi per aiuto Furter.

66

Spero che questo vi aiuterà 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

Inoltre ... la pubblicazione di ciò che equivale allo stesso frammento di codice più volte nello stesso intervallo di tempo viene considerata anche un po 'di spam. – Kev

+0

Molto utile e facile da implementare! – Triforcey

+0

Può farlo tramite XML? Non riesco a trovare un attributo per questo. –

2

la priorità su tutti i metodi

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


    } 

    @Override 
    public void onStartTrackingTouch(SeekBar arg0) { 


    } 

    @Override 
    public void onStopTrackingTouch(SeekBar arg0) { 


    } 
2

Tutte le risposte sono corrette, ma è necessario convertire un numero molto grosso grasso in un timer prima:

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

Ed ecco come lo si usa:

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