#android #increment #seekbar
#Android #увеличение #панель поиска
Вопрос:
Я хочу установить seekBarIncrement
в xml (а не программно). Я перепробовал много вариантов добавления его в мой xml, в том числе в стиле, как seekBarIncrement="100"
asp:seekBarIncrement="100"
и т.д. Ничего не ломается / не жалуется, но и приращения тоже нет — все значения панели поиска отличаются только на 1, а не на 100, и если я добавлю журнал в код, там тоже не будет никакого увеличения.
Как мне добиться seekBarIncrement
вступления в силу? Я использую android.support.v7.preference.SeekBarPreference
.
(Я расширил класс и вижу его значение, оно просто нигде не отображается и, похоже, ни на что не влияет)
Для справки, библиотека поддержки определяет следующее:
<declare-styleable name="SeekBarPreference">
<attr format="integer" name="min"/>
<attr name="android:max"/>
<attr name="android:layout"/>
<attr format="integer" name="seekBarIncrement"/>
<attr format="boolean" name="adjustable"/>
<attr format="boolean" name="showSeekBarValue"/>
</declare-styleable>
который можно увидеть установленным в самом SeekBarPreference
классе:
TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.SeekBarPreference, defStyleAttr, defStyleRes);
mMin = a.getInt(R.styleable.SeekBarPreference_min, 0);
setMax(a.getInt(R.styleable.SeekBarPreference_android_max, 100));
setSeekBarIncrement(a.getInt(R.styleable.SeekBarPreference_seekBarIncrement, 0));
mAdjustable = a.getBoolean(R.styleable.SeekBarPreference_adjustable, true);
mShowSeekBarValue = a.getBoolean(R.styleable.SeekBarPreference_showSeekBarValue, true);
Ответ №1:
Я добавил некоторую математику OnPreferenceChangeListener
, которая использует определенное приращение для правильного округления значения.
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final String key = preference.getKey();
if (key.equals(getString(R.string.key_scanning_delay))) {
final SeekBarPreference sbp = (SeekBarPreference) preference;
final int increment = sbp.getSeekBarIncrement();
float value = (int) newValue;
final int rounded = Math.round(value / increment);
final int finalValue = rounded * increment;
if (finalValue == value) return true;
else sbp.setValue(finalValue);
return false;
}
return true;
}
Я использую androidx.preference.SeekBarPreference
, но, вероятно, между этими двумя библиотеками практически нет различий.
Итак, сначала убедитесь, что это правильное предпочтение. Затем выполните вычисления. Если новое вычисленное значение совпадает со значением, с которым был вызван метод, return true
значение будет сохранено. Скорее всего, значения будут отличаться при первом запуске. В этом случае setValue
снова вызовите метод предпочтения, чтобы обновить представление (и метку значения, если она используется). На этот раз математика не требуется (очевидно), так что это return true
произойдет, и значение будет сохранено. Наконец return false
, исходное неисправленное значение будет отброшено.
Ответ №2:
В документации упоминается единственный атрибут xml android:thumb
, поэтому то, что вы пытаетесь сделать, кажется невозможным.
https://developer.android.com/reference/android/widget/SeekBar
Я бы предложил использовать либо программный подход, либо вы могли бы реализовать свою собственную ViewGroup, которая принимает такой параметр, как seekBarIncrement, а затем передает его в SeekBarPreference .
Комментарии:
1. На самом деле, библиотека поддержки определяет атрибуты, которые затем вызывает класс SeekBarPreference (я добавил эту информацию к своему вопросу), и эти атрибуты включают
seekBarIncrement
. Проблема, похоже, на самом деле ничего не делает или, по крайней мере, не влияет на мою панель поиска.2. После дальнейших исследований документация указывает, что это влияет только на клавиши со стрелками (хотя я не уверен, что такое клавиша со стрелкой на панели поиска?), Но мне это нужно, чтобы повлиять на саму панель. :/
3. Можете ли вы попробовать установить его с
app:seekBarIncrement
помощью? Я не уверен, что в вашем вопросе есть опечатка4. Спасибо, я понимаю
asp
, что этоres_auto
указатель, но я тоже попробовал ваше предложениеapp
. Однако, похоже, это все еще не влияет на панель