Две вещи требуются для использования ViewBinding с включенным макетом.
<merge>
не поддерживается
Документация охватывает только Data Binding , но не View Binding, но, похоже, применимо к обоим. См. https://developer.android.com/topic/libraries/data-binding/expressions#includes
Привязка данных не поддерживает включение в качестве прямого дочернего элемента элемента слияния.
Другими словами, макет должен иметь реальный, конкретный вид в качестве элемента root. Поддерживается следующее:
<LinearLayout ...>
<TextView ... />
<TextView ... />
</LinearLayout>
Но макет с <merge>
root не поддерживается:
<merge ...>
<TextView ... />
<TextView ... />
</merge>
Тег <include>
должен указывать ID
Как правило, макет можно включить без явного указания идентификатора. Привязка представления не поддерживает это:
<include layout="@layout/included_layout"/>
Даже если включенный макет имеет идентификатор в своем элементе root, он все равно не поддерживается. Вместо этого вы должны явно указать идентификатор в теге <include>
:
<include
android:id="@+id/some_id"
layout="@layout/included_layout"/>
После выполнения обоих этих условий созданная привязка для внешнего макета будет включать ссылку на привязку включенного макета. . Допустим, у нас есть два файла outer_layout.xml
и included_layout.xml
. Затем будут сгенерированы эти два файла:
OuterLayoutBinding.java
IncludedLayoutBinding.java
И вы можете ссылаться на включенные представления следующим образом:
val outerBinding = OuterLayoutBinding.inflate(layoutInflater)
val innerBinding = binding.someId // uses the id specified on the include tag
val innerView = innerBinding.viewPagerTop
Или, для краткости:
val binding = OuterLayoutBinding.inflate(layoutInflater)
val innerView = binding.someId.viewPagerTop