слушатель переключателя привязки данных Android не работает - PullRequest
0 голосов
/ 19 сентября 2018

Итак, я создал переменную val isSwitchChecked = ObservableBoolean(false) и добавил в XML при переключении, как это android:checked="@={viewmodel.isSwitchChecked()}", потому что я хочу установить его проверяемым с логическим значением, когда я загружаю данные, и все работает нормально, пока я не добавлю OnCheckedChangeListener, затем переключитене реагирует на слушателя, если я не удаляю этот android:checked="@={viewmodel.isSwitchChecked()}" из xml.В чем дело?и как я могу сделать так, чтобы это работало в обе стороны?

1 Ответ

0 голосов
/ 20 сентября 2018

То, как вы делаете, неправильно.

Причина сбоя

Если вы устанавливаете двухстороннее связывание на Switch, то OnCheckedChangeListener программно не будет работать.Поскольку внутренняя двусторонняя привязка зависит от OnCheckedChangeListener.

Правильный путь

Если вы выполняете двустороннюю привязку, установите прослушиватель check change также с помощью привязки.Я расскажу вам несколько способов.

Вот способы установить OnCheckedChangeListener в привязке данных:

(1) Установить с помощью выражение метода

В макете

<variable
    name="activity"
    type="com.innovanathinklabs.sample.activities.CalendarActivity"/>

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="@={model.checked}"
    android:onCheckedChanged="@{activity::onGenderChanged}"
    />

В действии

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
        binding.activity = this
        binding.model = Model()
    }

    fun onGenderChanged(buttonView: CompoundButton, isChecked: Boolean) {
        println("buttonView = [$buttonView], isChecked = [$isChecked]")
    }
}

(2) Устанавливается лямбда-выражением и вызов метода

<variable
    name="model"
    type="com.innovanathinklabs.sample.data.Model"/>

<variable
    name="activity"
    type="com.innovanathinklabs.sample.activities.HomeActivity"/>

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="@={model.checked}"
    android:onCheckedChanged="@{(button, bool)-> activity.saveGender(bool)}"
    />

В Activity

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
        binding.activity = this
        binding.model = Model()
    }

    fun saveGender(isChecked: Boolean) {
        println("isChecked = [$isChecked]")
    }
}

(3) Передача OnCheckedChangeListener анонимного класса в макет

<variable
    name="onGenderChange"
    type="android.widget.CompoundButton.OnCheckedChangeListener"/>

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="@={model.checked}"
    android:onCheckedChanged="@{onGenderChange}"
    />

В Activity

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
        binding.model = Model()
        binding.setOnGenderChange { buttonView, isChecked ->
            println("buttonView = [$buttonView], isChecked = [$isChecked]")
        }
    }
}

(4) Передать OnCheckedChangeListener по ссылке

<variable
    name="onGenderChange2"
    type="android.widget.CompoundButton.OnCheckedChangeListener"/>

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="@={model.checked}"
    android:onCheckedChanged="@{onGenderChange2}"
    />

Активность

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
        binding.model = Model()
        binding.onGenderChange2 = onGenderChange
    }

    private val onGenderChange: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
        println("buttonView = [$buttonView], isChecked = [$isChecked]")
    }
}

Это никогда не сработает

Поскольку вы не можете установитьдва обратных вызова на один компонент.Один обратный вызов уже установлен двусторонним связыванием, поэтому ваш обратный вызов не будет работать.

binding.mySwitch.setOnCheckedChangeListener { buttonView, isChecked ->
    println("buttonView = [$buttonView], isChecked = [$isChecked]")
}

Проверка CompoundButtonBindingAdapter class , чтобы увидеть, как работает связывание переключателей.

...