Jak zdefiniować minimalną wartość SeekBar? Czy jest to zrobione w układzie XML, czy też muszę zdefiniować to programowo?
Zasadniczo muszę zmienić moją minimalną wartość z 0 na 0,2
java
android
android-view
seekbar
Sachin
źródło
źródło
setProgress
aby zmiana została odzwierciedlona w interfejsie użytkownika - jak pokazuje Szabolcs Becze w swojej odpowiedzi.SeekBar
Oznacza zakres od 0 do (max-min). Aby uzyskać dostosowaną wartość, dodaj żądane minimum do rzeczywistego postępu. Ponieważ rzeczywisty postęp jest już „odzwierciedlony w interfejsie użytkownika”, nie ma tam nic do zmiany.Oto, czego używam, aby uzyskać
android:max
maksymalny / minimalny zakres dla aSeekBar
.mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { int progressChanged = minimumValue; public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { progressChanged = minimumValue+ progress; } });
Więc otrzymasz zakres
minimum to minimum+max
;Aby ustawić maksymalną wartość w xml, użyj
max=(desiredMax-min)
;źródło
Wartość minimalna musi wynosić 0 dla obiektu SeekBar w Javie (tj. Nie można jej zmienić), ale w ten sposób można uzyskać wymagany wygląd i wydajność.
Załóżmy, że chcesz, aby Twoja min. Wynosiła 5, a maksymalna 100 ...
Dlatego masz zakres 95, więc musisz ustawić SeekBar z maksymalną wartością
95
.Jeśli twój pasek wyszukiwania ma etykiety UI, możesz je ustawić
5
(min) i100
(max).Więc układ XML wyglądałby mniej więcej tak ...
<LinearLayout android:id="@+id/sampleSizeLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/batchDurationSecsLayout" android:orientation="vertical" android:visibility="visible" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/sample_size" /> <SeekBar android:id="@+id/sampleSizeSeekBar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:max="95" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:visibility="visible" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:gravity="left" android:text="5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:gravity="right" android:text="100" /> </RelativeLayout> </LinearLayout>
Więc teraz możesz wprowadzić
5
poprawkę, taką jak ta ...final SeekBar sampleSizeSeekBar = (SeekBar)findViewById(R.id.sampleSizeSeekBar); final int sampleSizeSeekBarCorrection = 5; //e.g., 95 <--> 100 int realValueFromPersistentStorage = appObj.getSampleSize(); //Get initial value from persistent storage, e.g., 100 sampleSizeSeekBar.setProgress(realValueFromPersistentStorage - sampleSizeSeekBarCorrection); //E.g., to convert real value of 100 to SeekBar value of 95. sampleSizeSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { int val = sampleSizeSeekBar.getProgress(); public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { val = progress + sampleSizeSeekBarCorrection; //e.g., to convert SeekBar value of 95 to real value of 100 } public void onStartTrackingTouch(SeekBar seekBar) { } public void onStopTrackingTouch(SeekBar seekBar) { try { appObj.saveSampleSize(val); //Save real value to persistent storage, e.g., 100 appObj.makeToast("Sample size set to " + val); } catch(Exception e) { Log.e(LOG_TAG, "Error saving sample size", e); appObj.makeToast("Error saving sample size: " + e); } } });
To rozwiązanie zapewni paskowi wyszukiwania prawidłowe wartości min, max i skalę w interfejsie użytkownika, a pozycja kontrolki nie przeskoczy w prawo, jeśli użytkownik przesunie ją do końca w lewo.
źródło
Zasadniczo dodałem rozmiar + 10, który automatycznie ustawi min na 10, możesz zmienić swoje, aby ustawić, które min. wartość.
@Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int siz = size + 10; txtViewFontSize.setTextSize(siz); Toast.makeText(this, String.valueOf(siz), Toast.LENGTH_SHORT).show(); }
źródło
W wersjach API> = 26 możesz teraz dodać
min
atrybut xml do SeekBar:android:min="0.2"
źródło
Moje rozwiązanie, które działa dobrze dla mnie, to:
@Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (progress <= SOME_LIMIT) { seekBar.setProgress(SOME_LIMIT); } else { // DO SOMETHING } }
źródło
Nie możesz ustawić postępu w float, ponieważ seekbar.getProgress () zawsze zwraca wartość całkowitą. Poniższy kod ustawi wartość textview na 0.2, jeśli wartość seekbar wynosi 0. Możesz zmienić minimumVal zgodnie z wymaganiami.
int minimumVal = 0; seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (progress >= minimumVal) { seekBar.setProgress(progress); textView.setText(progress); } else { seekBar.setProgress(minimumVal); textView.setText("0.2"); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });
źródło
Stworzyłem tę prostą bibliotekę, to niewiele, ale może zaoszczędzić trochę czasu.
https://github.com/joaocsousa/DoubleSeekBar
źródło
Możesz spróbować zrobić w ten sposób:
int yourMinProgress = 10;
private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { if (progress < yourMinProgress) { seekBar.setProgress(10); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } };
źródło
ten kod działa dla mnie dobrze !!!
SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar); seekBar.setMax(100); seekBar.setProgress(40); seekBar.setOnSeekBarChangeListener(seekBarChangeListener); SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { if(progress <= 40){ seekBar.setProgress(40); } if(progress >= 40) { pgr_status.setText(String.valueOf(progress)); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } };
źródło
W końcu znalazłem sposób na ustawienie
seekBar
wartości minimalnej , po prostu ustawsetOnSeekBarChangeListener
tak:int minimumValue = 10; // your minimum value seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // you can set progress value on TextView as usual txtProgress.setText(String.valueOf(progress)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { if(seekBar.getProgress() < minimumValue) seekBar.setProgress(minimumValue); } });
Mam nadzieję że to pomoże :)
źródło
Oto jak zrobiłem to z Kotlinem:
view.controlTextSize.setOnClickListener { textSizeControl.textSizeControlSlider.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { var progress = progress if (progress < 10){ progress = 10 seekBar?.progress = progress } view.content.textSize = progress.toFloat() prefs.edit().putFloat("ContentTextSize", progress.toFloat()).apply() } override fun onStartTrackingTouch(seekBar: SeekBar?) {} override fun onStopTrackingTouch(seekBar: SeekBar?) {} }) textSizeControl.show() }
źródło
Jeśli używasz
com.android.support:preference-v7
,SeekBarPreference
ma już metodęsetMin(int)
.Po prostu zadzwoń
onCreatePreferences()
do swojegoPreferenceFragmentCompat
.Wartości XML będą nadal ignorowane w API <26, ale ustawienie ich programowo działa.
źródło