Как включить макет Android, но также получить доступ к его элементам в привязке? - PullRequest
0 голосов
/ 13 июля 2020

Я делаю это в своей деятельности:

       <include
        android:id="@+id/withGyroLayout"
        layout="@layout/with_gyro_layout"/>

Где with_gyro_layout.xml -

<androidx.constraintlayout.widget.ConstraintLayout
    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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.util.FixedTransformerViewPager
        android:id="@+id/viewPagerTop"
        android:layout_width="0dp"
        android:layout_height="143dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.example.util.FixedTransformerViewPager
        android:id="@+id/viewPagerBottom"
        android:layout_width="0dp"
        android:layout_height="143dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/viewPagerTop" />
</androidx.constraintlayout.widget.ConstraintLayout>

Однако я не могу получить доступ к элементам viewPagerBottom или viewPagerTop из привязки для моей деятельности:

binding.viewPagerBottom.setVisibility(View.VISIBLE);
binding.viewPagerTop.setVisibility(View.VISIBLE);

Я попытался поставить with_gyro_layout.xml около <merge>...</merge>, но это тоже не помогло.

Я хочу иметь возможность программно изменять между with_gyro_layout.xml и without_gyro_layout.xml, а также доступ к его внутренним элементам с помощью привязки. Как я могу это сделать?

1 Ответ

1 голос
/ 13 июля 2020

Две вещи требуются для использования 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
...