Android包含参数-数据绑定未解析变量



我正在尝试使用带有数据绑定的<include>标记来重用一个通用布局
每个重复使用的布局都必须设置不同的标签
为了实现这一点,我试图将此值作为数据绑定参数(bind:test(传递
当我尝试在包含的xml(sync_row.xml(中使用从父xml(sync_fragment.xml(接收到的变量时,就会出现问题。
"android:text='@{test}"的行中,Android studio xml语法在"test"下划下划线,并表示:"找不到标识符"test">
与我所做的文档不同的唯一一件事是,不要在Android Studio中查看来自Android SDK的Android支持(因为我在列表中没有这个条目!(
我该如何解决这个问题
谢谢。

安卓工作室版本: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>

渐变文件:

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

编辑:
我刚刚将Android Studio版本更新到3.6.2。
红色突出显示问题似乎消失了
我仍然无法在片段上打印值,总是空字符串
我还尝试在sync_row.xml中强制输出,直接设置bind:text='@{"hello"}'。没有成功,仍然空标签打印在视图中。Gradle版本:5.6.4

根据Google规范,您不能直接在layout.xml中的绑定中输入字符串。

您应该首先将字符串放在strings.xml中,然后将它们绑定到layout.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>

将字符串放入string.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>

最新更新