Дискретная панель поиска Android не отображает отметки для максимальных значений ниже 2 - PullRequest
0 голосов
/ 19 декабря 2018

Установка атрибутов дискретного поискового бара на android: max = "1" не отображает отметку на обоих концах поисковой панели, даже если ее можно найти.

Но при установке android: max = "2" отображаются три отметки.

Как сделать так, чтобы отметка отображалась при максимальных значениях 0 и 1?

1 Ответ

0 голосов
/ 19 декабря 2018

Если вы посмотрите на исходный код AbsSeekBar, вы найдете этот метод:

/**
 * @hide
 */
protected void drawTickMarks(Canvas canvas) {
    if (mTickMark != null) {
        final int count = getMax() - getMin();
        if (count > 1) {
            final int w = mTickMark.getIntrinsicWidth();
            final int h = mTickMark.getIntrinsicHeight();
            final int halfW = w >= 0 ? w / 2 : 1;
            final int halfH = h >= 0 ? h / 2 : 1;
            mTickMark.setBounds(-halfW, -halfH, halfW, halfH);

            final float spacing = (getWidth() - mPaddingLeft - mPaddingRight) / (float) count;
            final int saveCount = canvas.save();
            canvas.translate(mPaddingLeft, getHeight() / 2);
            for (int i = 0; i <= count; i++) {
                mTickMark.draw(canvas);
                canvas.translate(spacing, 0);
            }
            canvas.restoreToCount(saveCount);
        }
    }
}

Важной частью является строка if (count > 1);по какой-то причине команда Google решила, что галочки не должны отображаться, если есть только два выбираемых значения.

Нет прекрасного способа обойти это.

Вам придетсяпереопределите весь этот метод, но он помечен @hide, что означает, что внешний мир не должен знать об этом.Это на самом деле * не остановит вас от этого, но это означает, что вам всегда нужно беспокоиться о том, что он сломается при обновлении Android.

Другая проблема заключается в том, что этот метод использует многополей, к которым у вас не будет доступа.Вы можете использовать геттеры, чтобы обойти это, но это немного коряво.

Собрав вместе, вы можете сделать этот класс:

public class MySeekBar extends SeekBar {

    public MySeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void drawTickMarks(Canvas canvas) {
        if (getTickMark() != null) {
            final int count = getMax() - getMin();

            // this is the important part: you change this to 0 from 1

            if (count > 0) {
                final int w = getTickMark().getIntrinsicWidth();
                final int h = getTickMark().getIntrinsicHeight();
                final int halfW = w >= 0 ? w / 2 : 1;
                final int halfH = h >= 0 ? h / 2 : 1;
                getTickMark().setBounds(-halfW, -halfH, halfW, halfH);

                final float spacing = (getWidth() - getPaddingLeft() - getPaddingRight()) / (float) count;
                final int saveCount = canvas.save();
                canvas.translate(getPaddingLeft(), getHeight() / 2);
                for (int i = 0; i <= count; i++) {
                    getTickMark().draw(canvas);
                    canvas.translate(spacing, 0);
                }
                canvas.restoreToCount(saveCount);
            }
        }
    }
}
...