Переключить одну кнопку и отключить другую - PullRequest
0 голосов
/ 08 мая 2020

Я изучаю Kotlin, и я пытаюсь сделать две кнопки, которые можно переключать со следующими характеристиками:

  1. Кнопка 1 запускается как переключенная (true), а кнопка 2 запускается как unoggled (false).
  2. Если я нажму на кнопку, которая не заблокирована, он переключается, а другой отключается.
  3. Если я нажимаю на кнопку, которая переключается, он становится неактивным и другая переключается.
  4. Если одна кнопка - истина, другая - ложь.
  5. Переключенная кнопка всегда желтого цвета, а другая незафиксированная - белого цвета.

кнопки код:

<ToggleButton
    android:id="@+id/button1"
    android:background="@color/yellow"
    android:text="ToggleButton"
    android:textOff="Ton"
    android:textOn="Ton"/>

<ToggleButton
    android:id="@+id/button2"
    android:background="@color/white"
    android:text="ToggleButton"
    android:textOff="Kg"
    android:textOn="Kg"/>

действие код:

private val btn1 by lazy { findViewById<View>(R.id.button1) as ToggleButton }
private val btn2 by lazy { findViewById<View>(R.id.button2) as ToggleButton }

btn1.setOnClickListener{
    btn1.setOnCheckedChangeListener { _, isChecked ->
        if (isChecked) { //if btn1 is true he is yellow and btn2 is false and he is white
            btn2.isChecked = false
            btn1.setBackgroundColor(Color.YELLOW)
            btnLoadModeFrac.setBackgroundColor(Color.WHITE)
        } else { //if btn1 is false he is white and btn2 is true and he is yellow
            btn2.isChecked = true
            btn1.setBackgroundColor(Color.WHITE)
            btn2.setBackgroundColor(Color.YELLOW)
        }
    }
}

ПРОБЛЕМА

Проблема здесь в том, что при первом щелчке я могу переключить как кнопку 1, так и кнопку 2 (обе верны), даже если я установил одну как false, а другую как true. После этого все работает хорошо.

Я пытался установить кнопку 1 в значение true, а кнопку 2 в значение false в своей деятельности перед вызовом функции, но это тоже не сработало.

Спасибо за любая помощь!

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Я думаю, что использование 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
1 голос
/ 08 мая 2020

Вам необходимо добавить OnCheckedChangeListener к btn1 и btn2. Вы только прикрепили его к OnCheckedChangeListener. И лог c для другого должен немного отличаться. Либо так, либо вы можете создать общий c OnCheckedChangeListener, который вы можете прикрепить к ОБЕИМ кнопкам, но затем вам нужно определить, какая кнопка была нажата, чтобы вы могли выполнить правильный logi c. View, по которому был сделан щелчок, передается как параметр методу.

...