Как мы можем отличить изменения состояния коммутатора, установленные программно, от тех, которые установлены пользователем?

У меня есть свитч. Это работает следующим образом: 1. Включите его, чтобы показать вам AlertDialog с Download/locate/cancel параметрами для выполнения (download)/(locate locally)/(cancel the dialog)

2.Выключите его, чтобы показать вам AlertDialog с Yes/No параметрами для удаления файлов.

Теперь предположим, что изначально состояние Switch равно OFF. Теперь, если я поверну его на ON, Listener зарегистрирует OnChecked как true. Затем, если я нажму «Отменить диалог», для OnChecked будет установлено значение false, поскольку файлы не были найдены/загружены. Теперь это изменение обнаруживается слушателем, даже если оно установлено программно. Мне нужен способ разделить Switch изменений состояния, вызванных пользователем и программой.

Мой слушатель — OnCheckedChangeListener.

Я знаю, что в Интернете есть похожие вопросы, решения которых либо временные, либо неполные.

РЕДАКТИРОВАНИЕ: я отредактировал и изменил всю структуру вопроса, чтобы решить мою основную задачу. Это не должно быть проблемой, так как на момент редактирования ответов нет.


person vamsidhar muthireddy    schedule 02.04.2017    source источник
comment
Какова ваша минимальная цель?   -  person Opiatefuchs    schedule 02.04.2017
comment
minSdkVersion 19 targetSdkVersion 25. Но как это связано с кастомным коммутатором и ошибкой инфляции   -  person vamsidhar muthireddy    schedule 02.04.2017
comment
Я спрашиваю, потому что он добавлен в API14...   -  person Opiatefuchs    schedule 02.04.2017
comment
Поскольку у меня API 19, это не должно быть проблемой. Но можно ли понять, в чем может быть проблема?   -  person vamsidhar muthireddy    schedule 02.04.2017
comment
Я думаю, потому что ваш mySwitch не инициализирован. Он должен быть инициализирован во всех ваших конструкторах...   -  person Opiatefuchs    schedule 02.04.2017
comment
Для будущих читателей: Эти вышеприведенные комментарии совершенно не связаны с текущим отредактированным вопросом. Пожалуйста, не тратьте время на то, чтобы разобраться в них.   -  person vamsidhar muthireddy    schedule 02.04.2017


Ответы (1)


В сети есть несколько ответов на этот вопрос. Они включают в себя написание пользовательских переключателей, расширяющих SwitchCompat, CompundButton и т. д.; с помощью метода SilentlySetChecked.

Если вместо OnCheckedChangeListener реализовать OnClickListener, не будет никакой рекурсии проблемы диалогового окна предупреждения. Но мы не можем обнаружить изменения Swipe в этом прослушивателе.

Просто нам нужно обнаружить изменения состояния, сделанные щелчком/пролистыванием без проблем с рекурсией:

    CompoundButton.OnCheckedChangeListener downloadButtonListener = new CompoundButton.OnCheckedChangeListener() { 
@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
if (holder.downloadSwitch.isPressed() & isChecked) {
//if switch is turned on by click/swipe
}
else if(holder.downloadSwitch.isPressed() & !isChecked{
//if switch is turned on by click/swipe
}
}
});

Это достаточно простое решение, которое решает проблему. Но он так и не появился в поиске, кроме частично здесь. Дайте мне знать, если есть лучшее решение, которое мне не хватает.

ПРИМЕЧАНИЕ. Я разместил это как решение, поскольку оно также отвечает на отредактированный вопрос. Я подожду несколько дней, чтобы получить лучшие ответы, прежде чем принять свое собственное решение.

person vamsidhar muthireddy    schedule 02.04.2017