Я думаю, что использование OnCheckedChangeListener
для переключения другой кнопки будет трудным способом решить проблему, потому что, когда одна из кнопок переключается, она захочет переключить другую, тем самым заставляя переключать другое и так далее.
Поскольку вы меняете цвет, чтобы он соответствовал состоянию переключения, было бы более уместно и надежно справиться с этим с помощью стилизации. Создайте StateListDrawable следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/yellow" android:state_checked="true"/>
<item android:drawable="@color/white"/>
</selector>
и установите его в качестве фона для обеих кнопок в файле макета, а не для явных цветов.
Вы также захотите установить один из кнопки, для которых нужно установить начальное состояние:
android:checked="true"
Самый простой способ заставить их менять друг друга - дать каждой из них прослушиватель щелчков, который переключает другую кнопку.
btn1.setOnClickListener { _ -> btn2.isChecked = !btn2.isChecked }
btn2.setOnClickListener { _ -> btn1.isChecked = !btn1.isChecked }
Но, на мой взгляд, не рекомендуется полагаться на элементы пользовательского интерфейса для хранения вашего состояния, если они вам нужны для синхронизации. Есть поведение пользовательского интерфейса, которое может быть привередливым (например, как быстро двойное нажатие кнопки, запускающей действие, может запустить две копии этого действия). Так что я бы сохранил ваше состояние в собственности. Вы можете сделать его наблюдаемым, поэтому при его изменении каждый раз будет явно устанавливаться состояние переключения обеих кнопок.
private val buttonState by Delegates.observable(true) { _, _, newState ->
btn1.isChecked = newState
btn2.isChecked = !newState
}
//...
val listener = View.OnClickListener { _ -> buttonState = !buttonState }
btn1.onClickListener = listener
btn2.onClickListener = listener