Android включить с параметром - Привязка данных не разрешающая переменная - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь использовать тег <include> с привязкой данных для повторного использования одного общего макета.
Каждый повторно использованный макет должен устанавливать разные метки.
Чтобы достичь этого, я пытаюсь передать это значение в качестве параметра привязки данных (bind: test).
Проблема возникает, когда я пытаюсь использовать переменную, полученную от родителя xml (sync_fragment. xml) во включенном xml (sync_row. xml).
В строке "android:text='@{test}", Android studio xml синтаксис подчеркивает 'test' и говорит: "Не удается найти идентификатор" test "".
Единственное, что отличается от документов i сделано не проверять Android Поддержка от Android SDK menù в Android Studio (потому что у меня нет этой записи в списке!).
Как я могу решить эту проблему?
Спасибо .

Android Версия Studio: 3.6.1
Версия Gradle: 5.6.4

Файл: sync_fragment. xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:weightSum="12">
            <include
                android:id="@+id/includedLayout1"
                layout="@layout/sync_row"
                bind:test='@{"TEST_DATA_BIND1"}' />

            <include
                android:id="@+id/includedLayout2"
                layout="@layout/sync_row"
                bind:test='@{"TEST_DATA_BIND2"}' />

            <include
                android:id="@+id/includedLayout3"
                layout="@layout/sync_row"
                bind:test='@{"TEST_DATA_BIND3"}' />
    </LinearLayout>
</layout>

Файл: sync_row. xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="test" type="String" />
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text='@{test}'/>
    </LinearLayout>
</layout>

Файл Gradle:

...
dataBinding {
    enabled = true
}
...  

РЕДАКТИРОВАТЬ:
Я только что обновил Android Студийная версия до 3.6.2.
Кажется, проблема с красной подсветкой исчезла.
Я все еще не могу напечатать значение во фрагменте, всегда пустую строку!
Я также пытался принудительно вызвать вывод внутри sync_row. xml, настройка напрямую связать: text = '@ {"hello"}'. Не удалось, все еще пустая этикетка напечатана в поле зрения. Версия Gradle: 5.6.4

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Поместите строку в строку. xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:weightSum="12">

            <include
                android:id="@+id/includedLayout1"
                layout="@layout/sync_row"
                bind:test='@{@string/your_string}' />

    </LinearLayout>
</layout>
1 голос
/ 03 апреля 2020

в соответствии со спецификациями Google, вы не можете вводить строки непосредственно в привязку в макете. xml.

Сначала вы должны поместить строки в строки. xml, а затем привязать их к макету. xml.

//strings.xml
<string name="TEST_DATA_BIND1"> TEST_DATA_BIND1 </string>
<string name="TEST_DATA_BIND2"> TEST_DATA_BIND2 </string>
<string name="TEST_DATA_BIND3"> TEST_DATA_BIND3 </string>

//sync_fragment.xml
<include
    android:id="@+id/includedLayout1"
    layout="@layout/sync_row"
    bind:test='@{@string/TEST_DATA_BIND1}' />

<include
    android:id="@+id/includedLayout2"
    layout="@layout/sync_row"
    bind:test='@{@string/TEST_DATA_BIND2}' />

<include
    android:id="@+id/includedLayout3"
    layout="@layout/sync_row"
    bind:test='@{@string/TEST_DATA_BIND3}' />

Или поместите строку в класс, а затем привяжите ее к Layou. xml.

// Constants.kt //*This is a test class, you should use your own class
const val TEST_DATA_BIND1 = "TEST_DATA_BIND1"
const val TEST_DATA_BIND2 = "TEST_DATA_BIND2"
const val TEST_DATA_BIND3 = "TEST_DATA_BIND3"

//sync_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="your_package_name.ConstantsKt"/>
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:weightSum="12">
            <include
                android:id="@+id/includedLayout1"
                layout="@layout/sync_row"
                bind:test='@{ConstantsKt.TEST_DATA_BIND1}' />

            <include
                android:id="@+id/includedLayout2"
                layout="@layout/sync_row"
                bind:test='@{ConstantsKt.TEST_DATA_BIND2}' />

            <include
                android:id="@+id/includedLayout3"
                layout="@layout/sync_row"
                bind:test='@{ConstantsKt.TEST_DATA_BIND3}' />
    </LinearLayout>
</layout>
...