Меню

android seekbar в настройках

SeekBar (Слайдер)

SeekBar — это обычный слайдер, когда пользователь может передвигать ползунок пальцем на экране. Ползунок также можно двигать при помощи клавиш-стрелок.

Компонент SeekBar находится в разделе Widgets и наследуется от класса ProgressBar. В Android Studio 3.0 представлен в двух вариантах: SeekBar и SeekBar (Discrete).

Для отслеживания перемещения ползунка SeekBar необходимо реализовать интерфейс SeekBar.OnSeekBarChangeListener с методами-заглушками:

  • onProgressChanged() — уведомляет об изменении положения ползунка;
  • onStartTrackingTouch() — уведомляет о том, что пользователь начал перемещать ползунок;
  • onStopTrackingTouch() — уведомляет о том, что пользователь закончил перемещать ползунок

Основное событие компонента SeekBar, которое наиболее часто используется на практике — SeekBar.OnSeekBarChangeListener.

Создадим новый проект и добавим компоненты SeekBar и TextView:

Напишем код, чтобы в текстовом поле отображалось текущее значение ползунка после того, как пользователь отпустит его.

Ниже представлены вариант на Android 5.0 и старый вариант на Android 2.3 до появления Material Design, чтобы вы видели, как менялся интерфейс.

Меняем задний фон экрана

Усложним пример и будем менять цвет у фона экрана. Добавим на форму три компонента SeekBar:

Напишем код, меняющий значение цвета через значения ползунка:

Кот Рыжик попросил выставить цвет, наиболее подходящий цвету его шкурки. Я решил ему немного польстить:

Дополнительное чтение

patryk1007/ShootingSlider — прикольный слайдер, напоминающий стрельбу из пушки в играх

источник

SeekBar в настройках приложения

Для создания экранов настроек Android предоставляет очень удобный набор виджетов, таких как CheckBoxPreference, EditTextPreference, ListPreference. В случае, если существующие виджеты по каким-либо причинам не соответствуют требованиям, можно создать свой собственный на базе существующих.

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

Подготовка

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

Назовем этот класс SeekBarPreference. Параметрами для него будут минимальное значение, максимальное значение и текущее значение по умолчанию, а реальное текущее значение он будет брать из ассоциированных настроек приложения по заданному ключу.

Тогда файл /res/xml/preferences.xml с разметкой настроек может выглядеть так:

Для задания значения по умолчанию можно использовать существующий тег, а вот для минимального и максимального придется создать свои. Для этого в файл /res/values/attrs.xml следует добавить описание атрибутов.

Атрибут name тега должен содержать квалифицированное имя класса нашего виджета.

Это же имя, только в более полном формате (schemas.android.com/apk/res/квалифицированное_имя_класса) должно быть указано в разметке файла настроек как дополнительное пространство имен (см. выше).

Последний этап работы с xml – это создание разметки диалога, который будет вызываться по нажатию виджета. Код разметки не представляет из себя ничего необычного, поэтому может быть опущен без последствий. Он содержит TextView для минимального значения, максимального значения, текущего значения, и, собственно, SeekBar.

Теперь можно продолжить с реализацией класса SeekBarPreference.

Реализация

Для начала необходимо прочитать указанные значения из атрибутов в конструкторе:

где константы – это имена пространств имен, атрибутов и значения по умолчанию для минимума, максимума и значения по умолчанию (на случай, если они не будут указаны в разметке):

Читайте также:  настройка core для youtube

Для инициализации диалога реализуем метод onCreateDialogView:

Значение читается по ключу, заданному в preferences.xml для виджета. При настройке SeekBar нужно учитывать, что для него минимальное значение – это всегда 0, поэтому приходится производить вычитание, если минимум отличен от нуля. Кстати, данный код верен только для неотрицательных чисел, а так же когда максимум больше минимума.

После этого уже можно запускать приложение и двигать ползунок, но текст текущего значения изменяться не будет, поскольку необходимо обработать изменения.

Для этого реализуем интерфейс OnSeekBarChangeListener у SeekBarPreference. В приведенном выше коде именно на этот интерфейс передается ссылка в mSeekBar.setOnSeekBarChangeListener(this) . Необходимо реализовать только один метод из трех возможных:

И опять же, из-за того, что минимальное значение SeekBar равно нулю, приходится применять сложение.

Следующий шаг – сохранение полученного значения. При применении или отмене изменений вызывается метод onDialogClosed , который и нужно переопределить:

При положительном варианте текущее значение сохраняется. Проверка shouldPersist() анализирует нужно ли это делать. При этом проверяется флаг android:persistent , указанный в preferences.xml.

Последняя строчка нужна для маленькой хитрости. Дело в том, что по умолчанию вторая строка виджета (summary) не динамическая, поэтому если хочется отображать в ней текущее значение, то необходимо добавить следующие строки:

Здесь, при запросе summary, оригинальная строка выполняет роль шаблона, в который подставляется текущее значение. Это превосходно работает при открытии экрана настроек. Но чтобы заставить этот код работать после изменения значения, необходимо вызвать notifyChanged() .

Результат

Полученный виджет подходит для применения к широкому спектру настроек и элегантно дополняет существующие виджеты. Подход с динамической строкой summary может использоваться и в других типах настроек.

источник

Пример использования SeekBar в Android

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

Виджет SeekBar в Android

По своей сути виджет SeekBar является расширением ProgressBar , но с функционалом перетягивания индикатора текущей позиции влево или вправо. Примером использования этого виджета в системе Android является управления громкостью или управление прогрессом воспроизведения музыки в Android плеере.

Подобно ProgressBar , виджет SeekBar использует два свойства: android:max и android:progress .

Для отслеживания прогресса используется интерфейс SeekBar.OnSeekBarChangeListener , предоставляющий методы для выполнения обработки различных событий в SeekBar :

  • Метод onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) используется для уведомления о каких-либо изменениях на уровне SeekBar .
  • Метод onStartTrackingTouch(SeekBar SeekBar) используется для оповещения о том, что пользователь прикоснулся к индикатору прогресса.
  • Метод onStopTrackingTouch(SeekBar SeekBar) используется для оповещения о том, что пользователь закончил взаимодействие с индикатором прогресса.

источник

SeekBar

SeekBar — это расширение ProgressBar, которое представляет собой слайдер. С его помощью пользователь может перемещать ползунок, устанавливая нужное значение прогресса. Например, с помощью слайдера можно регулировать уровень яркости или громкости.

Чтобы добавить SeekBar на активность, достаточно определить его XML.

Если вам нужно задать изначальный прогресс, то это можно сделать с помощью XML или программно.

    Через XML
    В коде разметки нужно добавить атрибут android:progress и передать в него уровень достигнутого прогресса.

По умолчанию максимальный прогресс равен 100, однако его можно изменить с помощью атрибута android:max.

Читайте также:  zyxel не сохраняет настройки wifi

Программно
В коде активности нужно определить экземпляр SeekBar и затем указать прогресс с помощью метода setProgress(), в аргументы которого передаётся значение прогресса.

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

Аналогично способу в XML, можно программно задать максимальное значение прогресса следующим образом.

Если вы хотите узнать текущий прогресс и его максимальное значение, вы можете воспользоваться методами getProgress() и getMax() соответственно.

К SeekBar можно добавить слушатель, который будет получать изменение прогресса. Сделать это можно с помощью метода setOnSeekBarChangeListener().

При этом будут реализованы 3 следующих метода:

  • onProgressChanged() — уведомляет о том, что в SeekBar произошли изменения (например, изменён прогресс).
  • onStartTrackingTouch() — уведомляет о том, что пользователь прикоснулся к ползунку.
  • onStopTrackingTouch() — уведомляет о том, что пользователь перестал касаться ползунка.

Настроим слушатель, чтобы он изменял уровень прозрачности фона у кнопки в зависимости от прогресса. Для этого в XML добавим Button.

Затем определим экземпляр Button в коде активности и после этого в методе onProgressChanged добавим изменение прозрачности. Также добавим всплывающие сообщение, сообщающие о срабатывании методов onStartTrackingTouch() и onStopTrackingTouch().

В результате получим следующее:

У SeekBar существует возможность кастомизации, заключающаяся в изменении полосы прогресса и ползунка на какой-либо свой.

Чтобы изменить полосу прогресса, нужно создать XML Drawable. Для этого в папке res/drawable создадим файл seek_bg.xml.

Затем в коде разметки воспользуемся атрибутом android:progressDrawable и передадим в него созданный файл.

Таким образом, можно легко изменить полосу прогресса у слайдера.

Аналогично можно заменить ползунок. Для этого нужно воспользоваться атрибутом android:thumb, в значении которого указать изображение, которое вы хотите использовать в качестве ползунка.

источник

Android seekbar в настройках

Администратор

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

Для создания экранов настроек Android предоставляет очень удобный набор виджетов, таких как CheckBoxPreference, EditTextPreference, ListPreference. В случае, если существующие виджеты по каким-либо причинам не соответствуют требованиям, можно создать свой собственный на базе существующих.

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

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

Назовем этот класс SeekBarPreference. Параметрами для него будут минимальное значение, максимальное значение и текущее значение по умолчанию, а реальное текущее значение он будет брать из ассоциированных настроек приложения по заданному ключу.

Тогда файл /res/xml/preferences.xml с разметкой настроек может выглядеть так:

Для задания значения по умолчанию можно использовать существующий тег, а вот для минимального и максимального придется создать свои. Для этого в файл /res/values/attrs.xml следует добавить описание атрибутов.

Атрибут name тега должен содержать квалифицированное имя класса нашего виджета.

Это же имя, только в более полном формате (schemas.android.com/apk/res/квалифицированное_имя_класса) должно быть указано в разметке файла настроек как дополнительное пространство имен (см. выше).

Последний этап работы с xml – это создание разметки диалога, который будет вызываться по нажатию виджета. Код разметки не представляет из себя ничего необычного, поэтому может быть опущен без последствий. Он содержит TextView для минимального значения, максимального значения, текущего значения, и, собственно, SeekBar.

Читайте также:  в настройках нет выхода на наушники

Теперь можно продолжить с реализацией класса SeekBarPreference.

Для начала необходимо прочитать указанные значения из атрибутов в конструкторе:

mMinValue = attrs.getAttributeIntValue(PREFERENCE_NS, ATTR_MIN_VALUE, DEFAULT_MIN_VALUE);
mMaxValue = attrs.getAttributeIntValue(PREFERENCE_NS, ATTR_MAX_VALUE, DEFAULT_MAX_VALUE);
mDefaultValue = attrs.getAttributeIntValue(ANDROID_NS, ATTR_DEFAULT_VALUE, DEFAULT_CURRENT_VALUE);

где константы – это имена пространств имен, атрибутов и значения по умолчанию для минимума, максимума и значения по умолчанию (на случай, если они не будут указаны в разметке):

private static final String PREFERENCE_NS = «http://schemas.android.com/apk/res/com.mnm.seekbarpreference»;
private static final String ANDROID_NS = «http://schemas.android.com/apk/res/android»;

private static final String ATTR_DEFAULT_VALUE = «defaultValue»;
private static final String ATTR_MIN_VALUE = «minValue»;
private static final String ATTR_MAX_VALUE = «maxValue»;

Для инициализации диалога реализуем метод onCreateDialogView:

@Override
protected View onCreateDialogView() <

// Читаем значение из настроек
mCurrentValue = getPersistedInt(mDefaultValue);

// Создаем элемент
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dialog_slider, null);

// Выставляем минимум и максимум
((TextView) view.findViewById(R.id.min_value)).setText(Integer.toString(mMinValue));
((TextView) view.findViewById(R.id.max_value)).setText(Integer.toString(mMaxValue));

// Настраиваем SeekBar
mSeekBar = (SeekBar) view.findViewById(R.id.seek_bar);
mSeekBar.setMax(mMaxValue — mMinValue);
mSeekBar.setProgress(mCurrentValue — mMinValue);
mSeekBar.setOnSeekBarChangeListener(this);

// Выставляем текущее значение
mValueText = (TextView) view.findViewById(R.id.current_value);
mValueText.setText(Integer.toString(mCurrentValue));

Значение читается по ключу, заданному в preferences.xml для виджета. При настройке SeekBar нужно учитывать, что для него минимальное значение – это всегда 0, поэтому приходится производить вычитание, если минимум отличен от нуля. Кстати, данный код верен только для неотрицательных чисел, а так же когда максимум больше минимума.

После этого уже можно запускать приложение и двигать ползунок, но текст текущего значения изменяться не будет, поскольку необходимо обработать изменения.

Для этого реализуем интерфейс OnSeekBarChangeListener у SeekBarPreference. В приведенном выше коде именно на этот интерфейс передается ссылка в mSeekBar.setOnSeekBarChangeListener(this). Необходимо реализовать только один метод из трех возможных:

public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) <
mCurrentValue = value + mMinValue;
mValueText.setText(Integer.toString(mCurrentValue));
>

И опять же, из-за того, что минимальное значение SeekBar равно нулю, приходится применять сложение.

Следующий шаг – сохранение полученного значения. При применении или отмене изменений вызывается метод onDialogClosed, который и нужно переопределить:

@Override
protected void onDialogClosed(boolean positiveResult) <
super.onDialogClosed(positiveResult);

if (!positiveResult) <
return;
>
if (shouldPersist()) <
persistInt(mCurrentValue);
>

При положительном варианте текущее значение сохраняется. Проверка shouldPersist() анализирует нужно ли это делать. При этом проверяется флаг android:persistent, указанный в preferences.xml.

Последняя строчка нужна для маленькой хитрости. Дело в том, что по умолчанию вторая строка виджета (summary) не динамическая, поэтому если хочется отображать в ней текущее значение, то необходимо добавить следующие строки:

@Override
public CharSequence getSummary() <
String summary = super.getSummary().toString();
int value = getPersistedInt(mDefaultValue);
return String.format(summary, value);
>

Здесь, при запросе summary, оригинальная строка выполняет роль шаблона, в который подставляется текущее значение. Это превосходно работает при открытии экрана настроек. Но чтобы заставить этот код работать после изменения значения, необходимо вызвать notifyChanged().

Полученный виджет подходит для применения к широкому спектру настроек и элегантно дополняет существующие виджеты. Подход с динамической строкой summary может использоваться и в других типах настроек.

источник

Добавить комментарий

Adblock
detector