2011-09-07 17 views
28

Mam pasek wyszukiwania, przesuwając go chcę zmienić wartości od 0 do 200. Mam TextView, gdzie wyświetlają te wartości podczas poruszania seekbar. Ale nie chcę mieć każdej wartości z tego przedziału (0,1,2,3,4,5 ...), ale mieć 10, 20, 30 ... tak dalej. Więc kiedy przesuję pasek wyszukiwania, chcę wyświetlić 10,20,30,40 ... do 200. Czy ktoś może dać mi wskazówkę lub przykład, jak to zrobić?Zmiana wartości kroku w oknie wyszukiwania?

Odpowiedz

84

Spróbuj poniżej kod

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) służy do ustawiania wartości wyjściowej paska wyszukiwania

setMax(int) służy do ustawiania maksymalnej wartości szukać poprzeczkę

Jeśli chcesz ustaw granice paska wyszukiwania, następnie możesz sprawdzić wartość paska postępu w metodzie onProgressChanged. Jeśli postęp jest mniejszy lub większy od granicy, możesz ustawić postęp do zdefiniowanej granicy.

+0

Wow, to tylko świetny przykład! W każdym razie, czy mogę ustawić minimalną wartość paska wyszukiwania na 10? Mogę ustawić maksimum, mówiąc "seekBar.setMax (200)", nie ma wartości minimalnej.Mam kilka pomysłów na temat tego, jak to zrobić, ale za każdym razem otrzymuję błędy ( – lomza

+0

Użyj seekBar.setProgress (10), dla ustawionej wartości minimalnej na 10 w pasku wyszukiwania – Dharmendra

+0

Rozwiązałem ten problem. Widzisz, kiedy właśnie ustawiłem postęp 10, nadal byłem w stanie ustawić 0, i chciałem niezdolny tej opcji (więc użytkownik nie może wybrać wartości mniejszej niż 10) Zrobiłem to, ale umieszczając instrukcję "if" w ChangeListener. – lomza

3

Powinieneś użyć SeekBar.OnSeekBarChangeListener do śledzenia zmiany postępu. Zadzwoń pod mseek.setMax(200). Wykonaj operację modulo na bieżącej wartości, aby zdecydować, czy tekst powinien zostać zaktualizowany, czy nie.

SeekBar.OnSeekBarChangeListener() { 

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

Prawdopodobnie przeskoczy wartości, jeśli pasek nie jest zbyt szeroki i/lub palec porusza się szybko. –

+0

Zgadzam się. To była pierwsza rzecz, która przyszła mi do głowy. i słusznie nie jest właściwą odpowiedzią. – Ronnie

+0

To jest ładny przykład, ale @Kris Van Bael ma rację, - pomija wartości. – lomza

15

easieset sposób mogę myśleć, jest po prostu określenia:

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

Następnie zastąpić te metody (wymagane są również puste metody, nawet jeśli są puste):

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

     } 
    }); 

Chodzi o to, aby zdefiniować tylko 20 wartości dla paska wyszukiwania, ale zawsze pomnóż wartość przez 10 i wyświetl tę wartość. Jeśli naprawdę nie potrzebujesz 200 wartości, nie ma sensu używanie 200 wartości.

+2

+1 dla uproszczenia. Szukałem innego problemu, skończyłem tutaj, ale myślałem, że zasługujesz na +1 –

+0

To wydaje się lepsze rozwiązanie na pewno. Podoba mi się, jak przeskakuje w prawo do następnego numeru. Postęp w czasie, gdy liczba jest statyczna, wydaje się dziwna. –

0

dla minimalnego problemu, możesz ustawić przesunięcie na swoich postępach. W ten sposób użytkownik nie może przekroczyć minimalnej wartości.

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

można również osiągnąć poprzez definiowanie niestandardowych SeekBar klasy jak poniżej

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

i może korzystać przez następujący sposób

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

w XML należy dodać CustomSeekBar zamiast SeekBar

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

Abyś mógł ponownie użyć niestandardowego seekBar w całej aplikacji bez powtarzania całych dodatkowych obliczeń.

Powiązane problemy