Применение адаптера привязки данных для включения тега - PullRequest
0 голосов
/ 06 июня 2018

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

<View
   app:visibilityCondition="@{viewModel.showingItems}" />

Это все работает нормально, но внезапно, когда я хочу использовать его в теге includeкак это:

<include
   layout="@layout/my_include_layout
   app:visibilityCondition="@{viewModel.showingItems}" />

Не собирается, со следующей ошибкой:

e: [kapt] Возникла исключительная ситуация: android.databinding.tool.util.LoggedErrorException: Обнаружены ошибки привязки данных.Не удается найти установщик для атрибута «app: visibilityCondition» с типом параметра boolean для com.example.CustomBinding.

Поскольку класс CustomBinding фактически не расширяется с View, а вместо этого ViewDataBinding, не похоже, что у меня есть способ сделать это.

Есть ли способ обойти это, или я вынужден устанавливать видимость этого включенного макета программно?Я знаю, что это сработает, но я бы очень хотел оставить это в привязке к данным, если это возможно.

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Итак, есть некоторая хитрость, если вы хотите, чтобы привязка данных работала, когда вы используете include в своих макетах, поэтому сделайте следующее:

Шаг 1 : измените свой XMLфайл, в котором вы используете тег include для чего-то вроде этого.Посмотрите внимательно, как я играю с именами переменных в этой привязке данных.

<data>
     <import type="com.example.jenny.MyViewModel"/>
     <variable
         name="viewModelNew"
         type="MyViewModel"/>

      <include
         layout="@layout/my_include_layout
         app:viewModel="@{viewModelNew}"/> <!--this, viewModel is the variable declared in xml which you are including here-->
</data>

Шаг 2 : И в макете, который вы включаете, т.е. в my_include_layout, выполните RealПривязка данных там выглядит следующим образом:

<data>
    <import type="com.example.jenny.MyViewModel"/>
    <variable
        name="viewModel"
        type="MyViewModel"/>
</data>

  <View
     app:visibilityCondition="@{viewModel.showingItems}"/><!--the real Data Binding is happening here-->

Шаг 3 : Кроме того, в своей деятельности или фрагменте, где бы вы ни инициализировали привязку данных, напишите

dataBinding.viewModelNew = new MyViewModel() // or something like this, you have to initialze the data binding variable

Дайте мне знать, если это поможет.

0 голосов
/ 15 марта 2019

Очевидно, что в настоящее время вы не можете использовать BindingAdapters с included элементами макета, но вы можете передавать свои переменные во включенные макеты (для их обработки).

What keshavАггарвал предлагается почти нормально.Вам нужно будет передать данные внутри included макета , но выставление всего ViewModel внутри макета не нужно и немного не элегантно.

  1. Измените my_include_layout, добавив переменную со связанным параметром.
<layout>
    <data>
        <variable
            name="visibilityCondition"
            type="<the_type_of_the_visibility>"/>
    </data>
    <View
        app:visibilityCondition="@{visibilityCondition}"/>
</layout>
Используйте пространство имен bind для передачи параметра видимости внутри макета included:
<include
   layout="@layout/my_include_layout
   bind:visibilityCondition="@{viewModel.showingItems}" />
0 голосов
/ 06 июня 2018

Предполагая, что ваш включенный макет все еще устанавливает условие видимости на основе viewModel, как показано в вашем первом фрагменте кода, и что тогда он должен иметь секцию <data>, которая определяет viewModel, я обычно задаю это вinclude заявление.Например:

<include
    bind:viewModel="@{viewModel}"
    layout="@layout/my_include_layout"/>
...