Как установить видимость для включения макета в привязку данных?

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

Тем не менее, я добился этого с помощью логического значения, но мой вопрос заключается в том, как программно установить видимость для этого включенного тега.

Мой xml:

<include
  android:id = "@+id/reg_email"
  layout = "@layout/custom_email"
  android:layout_width = "match_parent"
  android:layout_height = "match_parent"/>


<include
  android:id = "@+id/reg_phone"
  layout = "@layout/custom_phone"
  android:layout_width = "match_parent"
  android:layout_height = "match_parent"/>

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

  dataBinding.regPhone.setVisibility(View.GONE);
  dataBinding.regEmail.setVisibility(View.VISIBLE);

Является ли корень вашего xml <layout>?

Ben Shmuel 29.05.2019 19:32

да это так. У меня есть привязка данных в моем xml

Poyyamozhi Ramakrishnan 30.05.2019 07:20

А строка dataBinding.regPhone.setVisibility(View.GONE) сама по себе не работает? Другие привязки на вашем макете работают?

Ben Shmuel 30.05.2019 07:42

да, все остальные привязки работают нормально. Когда я пытаюсь включить, это не так, поскольку он не рассматривает его как представление, а как идентификатор для вложенного макета внутри него.

Poyyamozhi Ramakrishnan 30.05.2019 07:45

Чтобы связать включенные макеты, вы просто добавляете атрибут id к включенному макету в свой XML. setVisibility() работает с каждым представлением.. так что что-то не так с включенным макетом, который является custom_phone. Можете ли вы опубликовать его xml-код?

Ben Shmuel 30.05.2019 07:55

Ответ Махди сработал для меня, спасибо за вашу помощь.

Poyyamozhi Ramakrishnan 30.05.2019 16:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
6
4 063
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

добавить получить root в свой вид

dataBinding.regPhone.getRoot().setVisibility(View.GONE);
dataBinding.regEmail.getRoot().setVisibility(View.VISIBLE);

Почему это работает? Почему без getRoot() не работает?

Marian Paździoch 02.12.2020 17:04

root - это представление, без которого вы не можете вызвать setVisibility()

ezaspi 21.12.2021 17:53

Лучший способ.

В верхнем макете объявите логическое значение или наблюдаемое поле, значение которого переключает видимость включенного макета. Затем не забудьте поставить включенному макету id, иначе он не будет работать.

<?xml version = "1.0" encoding = "utf-8"?>
<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>
        <import type = "android.view.View"/>
        <variable
            name = "show"
            type = "Boolean" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        tools:background = "@color/colorPrimary">


        <include layout = "@layout/progress"
            android:id = "@+id/progress"
            android:visibility = "@{show?View.VISIBLE:View.GONE}"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Создайте группу с эталонным идентификатором представления для меня, потому что я включаю макет с помощью тега <merge>.

 <androidx.constraintlayout.widget.Group
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        app:constraint_referenced_ids = "emptyStateView,emptyStateDescription"
        android:visibility = "@{viewModel.searchResultState.result.size() == 0 ? View.VISIBLE : View.GONE}"/>

Другие вопросы по теме