Переключить видимость пользовательского представления в XML с помощью привязки данных

У меня есть макет фрагмента fragment_config.xml, который содержит следующее:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:bind="http://schemas.android.com/tools">
    <data>
        <import type="android.view.View"/>
        <variable name="viewModel" type ="...GlobalConfigViewModel"/>
    </data>
        ...
            <ToggleButton
                android:id="@+id/btnShowAdvanced"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textOff="Show Advanced"
                android:textOn="Hide Advanced"
                android:checked="@={viewModel.advancedShown}"/>


            <com.minh.minh.pumpnotifier.global.configuration.AdvancedBox
                android:id="@+id/advancedBox"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:visibility="@{viewModel.advancedShown ? View.VISIBLE : View.GONE}"
                app:viewModel = "@{viewModel}"/>

    ...
</layout>

Что должно произойти, так это то, что видимость Advanced Box переключается с «отмеченным» состоянием кнопки переключения. Я уже подтвердил, что двусторонняя привязка данных в кнопке-переключателе правильно устанавливает логическое значение «advancedShown» в модели представления. Однако метод setVisibility никогда не вызывается в классе AdvancedBox (который расширяет LinearLayout).

Что-то еще, что я пробовал, это установить привязку видимости в корневом элементе advanced_box.xml, так как он также имеет ссылку на viewModel:

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <import type="android.view.View"/>
        <variable
            name="viewModel"
            type="...GlobalConfigViewModel" />
    </data>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/advancedSettings"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="@{viewModel.advancedShown ? View.VISIBLE : View.GONE}"
        android:orientation="vertical">

Однако оба метода не работают. Мой вопрос: почему это не работает и как правильно использовать привязку данных в этом случае?


person Doflaminhgo    schedule 19.10.2018    source источник
comment
Является ли переменная viewModel.advancedShown ObservableField? Или, может быть, аннотирован @Bindable?   -  person ConstOrVar    schedule 19.10.2018
comment
Не могли бы вы предоставить код GlobalConfigViewModel?   -  person ConstOrVar    schedule 19.10.2018
comment
Нет, это просто логическая переменная. Может ли это быть проблема?   -  person Doflaminhgo    schedule 19.10.2018
comment
ниже этой логической переменной вам нужно определить набор (значение) {поле = значение notifyPropertyChanged (BR.advancedShown)}   -  person Akash Dubey    schedule 19.10.2018
comment
работает отлично, спасибо за ваш вклад, ребята :)   -  person Doflaminhgo    schedule 19.10.2018


Ответы (1)


Ваш viewModel.advancedShown должен быть ObservableField или помечен аннотацией @Bindable (во втором варианте вы необходимо вручную вызвать notifyPropertyChanged(BR.advancedShown) на вашем GlobalConfigViewModel, чтобы инициировать изменения). Дополнительную информацию можно найти в официальной документации.

person ConstOrVar    schedule 19.10.2018