Я реализовал привязку данных в своем проекте. У меня есть конкретный экран с двумя вложенными макетами в тегах 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
А строка dataBinding.regPhone.setVisibility(View.GONE) сама по себе не работает? Другие привязки на вашем макете работают?
да, все остальные привязки работают нормально. Когда я пытаюсь включить, это не так, поскольку он не рассматривает его как представление, а как идентификатор для вложенного макета внутри него.
Чтобы связать включенные макеты, вы просто добавляете атрибут id к включенному макету в свой XML. setVisibility() работает с каждым представлением.. так что что-то не так с включенным макетом, который является custom_phone. Можете ли вы опубликовать его xml-код?
Ответ Махди сработал для меня, спасибо за вашу помощь.
добавить получить root в свой вид
dataBinding.regPhone.getRoot().setVisibility(View.GONE);
dataBinding.regEmail.getRoot().setVisibility(View.VISIBLE);
Почему это работает? Почему без getRoot() не работает?
root - это представление, без которого вы не можете вызвать setVisibility()
Лучший способ.
В верхнем макете объявите логическое значение или наблюдаемое поле, значение которого переключает видимость включенного макета. Затем не забудьте поставить включенному макету 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}"/>
Является ли корень вашего xml
<layout>
?