SeekBarPreference seekBarIncrement

#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 . Однако, похоже, это все еще не влияет на панель