Як визначити мінімальне значення SeekBar? Чи робиться це в XML-макеті, чи мені це потрібно визначати програмно?
В основному мені потрібно змінити своє мінімальне значення з 0 на 0,2
Відповіді:
Як визначити мінімальне значення SeekBar?
Ви не можете визначити мінімальне значення. Це так 0
.
В основному мені потрібно змінити своє мінімальне значення з 0 на 0,2
Отримавши значення, додайте 0.2
до нього.
SeekBar
Являє собою діапазон від 0 до (макс-мін). Щоб отримати скориговане значення, ви додаєте бажаний мінімум до фактичного прогресу. Оскільки фактичний прогрес вже "відображається на інтерфейсі користувача", там нічого змінити немає.
Ось те, що я використовую для отримання android:max
максимального / мінімального діапазону для SeekBar
.
mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int progressChanged = minimumValue;
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progressChanged = minimumValue+ progress;
}
});
Так ви отримаєте асортимент minimum to minimum+max
;
Щоб встановити максимальне значення в xml, використовуйте max=(desiredMax-min)
;
Мінімальне значення має бути 0 для об'єкта SeekBar в Java (тобто його не можна змінити), але саме так можна отримати необхідний вигляд та продуктивність.
Припустимо, ви хочете, щоб ваш хв становив 5, а макс - 100 ...
Отже, у вас є діапазон 95, тому вам потрібно буде встановити SeekBar з максимальним значенням 95
.
Якщо ваша панель пошуку має мітки інтерфейсу користувача, ви зробите їх 5
(хв) і100
(макс.).
Отже, макет XML мав би щось на зразок ...
<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>
Тож тепер ви можете ввести 5
виправлення, як це ...
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);
}
}
});
Це рішення надасть вашій панелі пошуку правильний мінімальний, максимальний та масштабний інтерфейс, а положення елемента керування не буде «стрибати» вправо, якщо користувач посуне його до кінця вліво.
В основному я додав розмір + 10, який автоматично встановить мінімум на 10, ви можете змінити свій, щоб встановити, який мінімум. значення.
@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();
}
У версіях api> = 26 тепер ви можете додати min
атрибут xml до SeekBar:
android:min="0.2"
Моє рішення, яке мені добре підходить:
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (progress <= SOME_LIMIT) {
seekBar.setProgress(SOME_LIMIT);
} else {
// DO SOMETHING
}
}
Ви не можете встановити прогрес у плаваючій системі, оскільки searchbar.getProgress () завжди повертає ціле значення. Наступний код встановить значення textview на 0,2, якщо значення панелі пошуку дорівнює 0. Ви можете змінити minimumVal відповідно до ваших вимог.
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) {
}
});
Я створив цю просту бібліотеку, це не так багато, але це може заощадити ваш час.
Ви можете спробувати зробити так:
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) {
}
};
цей код працює для мене чудово !!!
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) {
}
};
Нарешті я знайшов спосіб встановити seekBar
мінімальне значення , просто встановив встановити ваш setOnSeekBarChangeListener
такий:
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);
}
});
Сподіваюся, це допомагає :)
Ось як я це зробив з Котліном:
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()
}
setProgress
щоб зміни відобразились на інтерфейсі користувача - як демонструє Сабольч Бече у своїй відповіді.