【问题标题】:SeekBarPreference seekBarIncrementSeekBarPreference seekBarIncrement
【发布时间】:2019-04-11 05:54:38
【问题描述】:

我想在 xml 中设置 seekBarIncrement(而不是以编程方式)。我已经尝试了许多将它添加到我的 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);

【问题讨论】:

    标签: android increment seekbar


    【解决方案1】:

    在文档中,唯一提到的 xml 属性是 android:thumb,所以您尝试做的似乎不可能。

    https://developer.android.com/reference/android/widget/SeekBar

    我建议使用编程方法,或者您可以实现自己的 ViewGroup,它接受像 seekBarIncrement 这样的参数,然后将其传递给 SeekBarPreference。

    【讨论】:

    • 实际上,支持库定义了 SeekBarPreference 类然后调用的属性(我已将此信息添加到我的问题中),这些属性包括 seekBarIncrement。这个问题似乎并没有真正做任何事情,或者至少对我的搜索栏没有影响。
    • 经过进一步研究,文档表明它仅影响箭头键(尽管我不确定搜索栏上的箭头键是什么?)但我需要它来影响栏本身。 ://
    • 您可以尝试使用app:seekBarIncrement 进行设置吗?我不确定你的问题是否有错别字
    • 谢谢,我理解asp 是一个res_auto 指针,但我也尝试了你对app 的建议。但是,它似乎仍然没有影响酒吧
    【解决方案2】:

    我向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,所以原来的未更正的值将被丢弃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多