Material Design 3 MaterialSwitch, используемый в макете включения, не меняет визуальное состояние.

Material Design 3 MaterialSwitch, используемый в макете включения, не меняет визуальное состояние при касании или сдвиге вправо.

Посмотрите, что произойдет, когда я коснусь или сдвину включенный переключатель материала:состояние MaterialSwitch не отмечено. Состояние MaterialSwitch проверено.

Обратите внимание, что положение и цвет дорожки слайдов не такие, как они должны выглядеть в соответствии с задокументированным ожидаемым поведением .

Значок большого пальца изменится, но большой палец не будет сдвигаться вправо при изменении цвета дорожки. (Это не встроенное поведение, но оно дает понять, что что-то не работает.)

Подтверждено, что логическое значение isChecked MaterialSwitch меняется с false на true (журнал Android Studio).

Многоразовый макет включения Standard_include_layout.xml:

      <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable name="wasChecked" type="Boolean" />
    </data>

    <com.google.android.material.materialswitch.MaterialSwitch
        android:id="@+id/check_switch"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:enabled="true"
        android:checked="@={wasChecked}" />
...

Включите файлstandard_include_layout.xml в XML макета фрагмента:

      ...
<include
    android:id="@+id/includedLayout"
    layout="@layout/standard_include_layout"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:wasChecked="@={viewmodel.wasChecked}" />
...

Установите состояние значка во фрагменте:

         override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
...
        viewModel.wasChecked.observe(viewLifecycleOwner) {
            includedLayout.checkSwitch.isChecked = it
            if (it == true)
                checkSwitch.thumbIconDrawable =  AppCompatResources.getDrawable(context, R.drawable.ic_checkmark)
            else checkSwitch.thumbIconDrawable = null
        }

ViewModel LiveData val referenced:

    val wasChecked = MutableLiveData<Boolean>().apply {
        value = false
    }

Если включаемый макет не задействован. Все работает, как указано в документации. Коснитесь или сдвиньте вправо, чтобы изменить положение ползунка слайда, изменить цвет дорожки и установить значок ползунка.

Есть идеи, что не так?

1 ответ

Присоединение setOnCheckedChangeListener программно вместо наблюдения за значением привязки для изменения будет работать.

      includedLayout.checkSwitch.setOnCheckedChangeListener { buttonView, isChecked ->
    viewModel.wasChecked.value = isChecked

    // To-do: Figure out how to change the thumb icon here, if it's even possible; using buttonView did not work.
}

// Workaround for being unable to set thumb icon within setOnCheckedChangeListener.
viewModel.wasChecked.observe(viewLifecycleOwner) {
    // Set thumb icon.
    if (isChecked == true)
        aMaterialSwitch.thumbIconDrawable =
            AppCompatResources.getDrawable(requireContext(), R.drawable.ic_checkmark)
    else
        aMaterialSwitch.thumbIconDrawable = null
}
Другие вопросы по тегам