2011-09-07 25 views
28

Ho una barra di ricerca, mentre spostandola voglio cambiare i valori da 0 a 200. Ho un TextView, dove visualizzo quei valori mentre muovo la barra di ricerca. Ma non voglio avere ogni valore da quell'intervallo (0,1,2,3,4,5 ...), ma avere 10, 20, 30 ... così via. Quindi quando sposto la barra di ricerca, voglio visualizzare 10,20,30,40 .... a 200. Qualcuno può darmi un suggerimento o un esempio su come farlo?Modifica dei valori dei passaggi nella barra di ricerca?

risposta

84

Prova sottostante Codice

SeekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar); 
seekBar.setProgress(0); 
seekBar.incrementProgressBy(10); 
seekBar.setMax(200); 
TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue); 
seekBarValue.setText(tvRadius.getText().toString().trim()); 

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progress = progress/10; 
     progress = progress * 10; 
     seekBarValue.setText(String.valueOf(progress)); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
}); 

setProgress(int) viene utilizzato per impostare il valore iniziale della barra di ricerca

setMax(int) viene utilizzato per impostare il valore massimo di barra di ricerca

Se si desidera impostare i limiti della barra di ricerca, quindi è possibile controllare il valore della barra di avanzamento nel metodo onProgressChanged. Se il progresso è inferiore o superiore al limite, è possibile impostare l'avanzamento sul limite definito.

+0

Wow, questo è solo un ottimo esempio! Ad ogni modo, posso impostare il valore minimo della barra di ricerca su 10? Posso impostare il massimo, dicendo 'seekBar.setMax (200)', non esiste un valore minimo.Ho alcune idee su come farlo, ma ottengo sempre errori ( – lomza

+0

Usa seekBar.setProgress (10), per impostare il valore minimo su 10 nella barra di ricerca – Dharmendra

+0

Ho risolto questo problema. Vedete, quando ho appena impostato un progresso per 10, ero ancora in grado di impostare 0, e non volevo questa opzione (quindi l'utente non può scegliere un valore inferiore a 10.) Ho fatto questo ma inserendo un'istruzione "if" in ChangeListener. – lomza

3

È necessario utilizzare SeekBar.OnSeekBarChangeListener per tenere traccia della modifica dell'avanzamento. Chiama lo mseek.setMax(200). Esegui un'operazione modulo sul valore corrente per decidere se la visualizzazione testuale deve essere aggiornata o meno.

SeekBar.OnSeekBarChangeListener() { 

    void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     if (progress % 10 == 0) { 
      textview.setText(""+progress); 
     } 
    } 
} 
+2

È probabile che salti i valori se la barra non è molto ampia e/o il tuo dito si muove velocemente. –

+0

Accetto. Questa è stata la prima cosa che mi è venuta in mente. e giustamente non è la risposta giusta. – Ronnie

+0

Questo è un buon esempio, ma @Kris Van Bael ha ragione, - salta i valori. – lomza

15

Il modo easieset posso pensare, è semplicemente definire:

SeekBar yourSeekBar = (SeekBar)findViewById(R.id.yourSeekBarId); 
yourSeekbar.setMax(20); 

Avanti, prevalere su tali metodi (sono necessari anche metodi vuoti, anche se sono vuote):

yourSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {   
     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      if (fromUser) { 
       if (progress >= 0 && progress <= sizeSeekBar.getMax()) {       

        String progressString = String.valueOf(progress * 10); 
        yourTextView.setText(progressString); // the TextView Reference 
        seekBar.setSecondaryProgress(progress); 
       } 
      } 

     } 
    }); 

L'idea è di definire solo 20 valori per la barra di ricerca, ma moltiplicare sempre il valore per 10 e visualizzare quel valore. Se non hai davvero bisogno di 200 valori, allora non ha senso usare 200 valori.

+2

+1 per semplicità. Ho cercato un altro problema, sono finito qui, ma ho pensato che meritassi il +1 –

+0

Questa sembra la soluzione migliore di sicuro. Mi piace come salta al prossimo numero. Andare avanti mentre il numero è statico sembra strano. –

0

per il problema minimo, è possibile impostare un offset sul vostro progresso. In questo modo, l'utente non può andare sotto il tuo valore minimo.

int offset = 10; 

seekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar); 
seekBar.setProgress(0); 
seekBar.setMax(190); //with the offset, you need to adapt the max value 
TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue); 
seekBarValue.setText(""+(seekBar.getProgress() + offset)); 

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progress += offset; 

     seekBarValue.setText(String.valueOf(progress)); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
}); 
1

È inoltre possibile raggiungere questo obiettivo attraverso la definizione di classe SeekBar personalizzata come di seguito

public class CustomSeekBar extends AppCompatSeekBar { 


int SEEKBAR_MULTIPLIER = 1; 

public CustomSeekBar(Context context) { 
    super(context); 
} 

public CustomSeekBar(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

public void setSeekBarConfig(int SEEKBAR_MULTIPLIER, int SEEKBAR_MAX){ 
    setMax(SEEKBAR_MAX); 
    this.SEEKBAR_MULTIPLIER = SEEKBAR_MULTIPLIER; 
} 

@Override 
public int getProgress() { 
    return super.getProgress() * SEEKBAR_MULTIPLIER; 
} 
} 

E possibile utilizzare seguendo modo

CustomSeekBar mCustomSeekBar = (CustomSeekBar) findViewById(R.id.customSeekBar); 
mSeekBar.setSeekBarConfig(10,20); 

in XML si dovrebbe aggiungere CustomSeekBar invece di SeekBar

<*.CustomSeekBar 
    com.quemb.qmbform.view:setSeekBarConfig="10" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/seekBar" /> 

In modo che è possibile riutilizzare la barra di ricerca personalizzata in tutta l'app senza ripetere l'intero calcolo extra.

Problemi correlati