setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// How to check whether the checkbox/switch has been checked
// by user or it has been checked programatically ?
if (isNotSetByUser())
return;
handleSetbyUser();
}
});
Как реализовать метод isNotSetByUser()
?
Ответы:
Ответ 2:
Очень простой ответ:
Используйте OnClickListener вместо OnCheckedChangeListener
Теперь вы регистрируете только события кликов и не должны беспокоиться о программных изменениях.
Ответ 1:
Я создал класс-оболочку (см. Шаблон декоратора), который решает эту проблему инкапсулированным способом:
CheckBox все равно можно объявить в XML, но используйте это при инициализации вашего графического интерфейса в коде:
Если вы хотите установить проверку из кода без запуска слушателя, вызовите
myCheckBox.silentlySetChecked(someBoolean)
вместоsetChecked
.источник
Switch
ответ 1 работает как в случае касания, так и в случае слайдов, тогда как ответ 2 будет работать только в случае касания. В качестве личного предпочтения я сделал свой класс расширеннымCheckBox
/Switch
вместо того, чтобы содержать ссылку на него. Так выглядит чище (обратите внимание, что вы должны указать полное имя пакета в XML, если вы это сделаете).listener
кmyListener
всякий раз , когдаlistener
не равно нулю. Почти во всех случаях это ничего не дает, но если мы по какой-то причине создадим нового слушателя, это не сломается.Может, можно проверить isShown ()? Если ИСТИНА - то пользователь. Работает для меня.
источник
Внутри
onCheckedChanged()
просто проверьте, есть ли у пользователяchecked/unchecked
переключатель, а затем выполните следующие действия:источник
isPressed
возвращает false, устройство Nokia с включенным TalkBack.Вы можете удалить слушателя, прежде чем изменять его программно, и добавить его снова, как указано в следующем сообщении SO:
https://stackoverflow.com/a/14147300/1666070
источник
Попробуйте расширить CheckBox. Примерно так (пример не полный):
источник
Есть еще одно простое решение, которое очень хорошо работает. Пример для Switch.
источник
Интересный вопрос. Насколько мне известно, как только вы находитесь в слушателе, вы не можете определить, какое действие запустило слушателя, контекста недостаточно. Если вы не используете внешнее логическое значение в качестве индикатора.
Когда вы устанавливаете флажок «программно», установите логическое значение перед, чтобы указать, что это было сделано программно. Что-то вроде:
И в вашем слушателе не забудьте сбросить состояние флажка:
источник
Попробуйте
NinjaSwitch
:Просто позвоните,
setChecked(boolean, true)
чтобы изменить состояние переключателя без обнаружения!источник
Если
OnClickListener
он уже установлен и не должен быть перезаписан, используйте!buttonView.isPressed()
какisNotSetByUser()
.В противном случае лучший вариант - использовать
OnClickListener
вместоOnCheckedChangeListener
.источник
Принятый ответ можно немного упростить, чтобы не сохранять ссылку на исходный флажок. Это позволяет использовать
SilentSwitchCompat
(или,SilentCheckboxCompat
если хотите) непосредственно в XML. Я также сделал это так , вы можете установить ,OnCheckedChangeListener
чтобы ,null
если вы хотите , чтобы сделать это.Затем вы можете использовать это прямо в своем XML, например (Примечание: вам понадобится полное имя пакета):
Затем вы можете установить флажок в автоматическом режиме, позвонив:
источник
Вот моя реализация
Код Java для пользовательского переключателя:
Эквивалентный код Котлина:
Чтобы изменить состояние переключателя без запуска слушателя, используйте:
Вы можете отслеживать изменение состояния как обычно:
В Котлине:
источник
Мой вариант с функциями расширения Kotlin:
... к сожалению, нам нужно каждый раз передавать onCheckedChangeListener, потому что класс CheckBox не имеет получателя для поля mOnCheckedChangeListener ((
Использование:
источник
Создать переменную
В приложении, когда вы меняете его вместо пользователя, вызовите,
notSetByUser(true)
чтобы он не был установлен пользователем, иначе вызовите,notSetByUser(false)
т.е. он будет установлен программой.Наконец, в прослушивателе событий после вызова isNotSetByUser () убедитесь, что вы снова вернули его в нормальное состояние.
Вызывайте этот метод всякий раз, когда вы обрабатываете это действие через пользователя или программно. Вызовите notSetByUser () с соответствующим значением.
источник
Если тег представления не используется, вы можете использовать его вместо расширения флажка:
каждый раз, когда вы вызываете что-то, что проверяет / снимает отметку, также вызывайте это перед установкой / снятием отметки:
источник
Я создал расширение с помощью RxJava
PublishSubject
, простое. Реагирует только на события "OnClick".источник