У меня есть стрелка, а при перемещении я хочу изменить значения от 0 до 200. У меня есть TextView, где я отображаю эти значения при перемещении стрелки. Но я не хочу иметь каждое значение с этого интервала (0,1,2,3,4,5...), но иметь 10, 20, 30... и так далее. Поэтому, когда я перемещаю поиск, я хочу отобразить 10,20,30,40.... до 200. Может ли кто-нибудь дать мне подсказку или пример, как это сделать?
Изменение значений шагов в строке поиска?
Ответ 1
Попробуйте ввести код
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)
используется для установки начального значения строки поиска
setMax(int)
используется для установки максимального значения строки поиска
Если вы хотите установить границы поиска, то вы можете проверить значение progressbar в методе onProgressChanged
. Если прогресс меньше или больше границы, вы можете установить прогресс на указанную вами границу.
Ответ 2
Легкий способ, о котором я могу думать, просто определяет:
SeekBar yourSeekBar = (SeekBar)findViewById(R.id.yourSeekBarId);
yourSeekbar.setMax(20);
Затем переопределите эти методы (необходимы и пустые методы, даже если они пусты):
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);
}
}
}
});
Идея состоит в том, чтобы определять только 20 значений для поиска, но всегда умножать значение на 10 и отображать это значение. Если вам не нужны 200 значений, тогда нет смысла использовать 200 значений.
Ответ 3
Вы должны использовать SeekBar.OnSeekBarChangeListener
для отслеживания изменения хода. Вызовите mseek.setMax(200)
. Выполняйте операцию по модулю текущего значения, чтобы решить, нужно ли обновлять текст или нет.
SeekBar.OnSeekBarChangeListener() {
void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (progress % 10 == 0) {
textview.setText(""+progress);
}
}
}
Ответ 4
Вы также можете достичь этого, указав собственный класс SeekBar, как показано ниже
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;
}
}
И может использоваться следующим образом
CustomSeekBar mCustomSeekBar = (CustomSeekBar) findViewById(R.id.customSeekBar);
mSeekBar.setSeekBarConfig(10,20);
В xml вы должны добавить CustomSeekBar вместо SeekBar
<*.CustomSeekBar
com.quemb.qmbform.view:setSeekBarConfig="10"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/seekBar" />
Чтобы вы могли повторно использовать пользовательский seekBar в целом приложении, не повторяя весь дополнительный расчет.
Ответ 5
для минимальной проблемы вы можете установить смещение на своем прогрессе. Таким образом, пользователь не может перейти под минимальное значение.
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) {
}
});
Ответ 6
использовать функцию Math.round
fun round(n: Int): Int {
// Smaller multiple
val a = n / 10 * 10
// Larger multiple
val b = a + 10
// Return of closest of two
return if (n - a > b - n) b else a
}
Ответ 7
Одним из возможных решений было бы установить seekBar.setMax(20)
(или android:max="20"
в XML), и всякий раз, когда вы используете или отображаете значение, умножьте его на 10.
SeekBar будет двигаться не менее 20 за раз.