java - Android 包含参数 - 数据绑定(bind)不解析变量

标签 java android android-studio android-layout data-binding

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

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 Studio 版本更新到 3.6.2。
红色高亮问题似乎消失了。
我仍然无法打印 fragment 上的值,始终为空字符串!
我还尝试在sync_row.xml 中强制输出,直接设置bind:text='@{"hello"}'。没有成功, View 中仍然打印空标签。 Gradle 版本:5.6.4

最佳答案

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

您应该首先将字符串放入 strings.xml 中,然后将它们绑定(bind)到 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}' />

或者,将字符串放入类中,然后将其绑定(bind)到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>

关于java - Android 包含参数 - 数据绑定(bind)不解析变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60995608/

相关文章:

java - 通过 Arrays.copyOf() 生成的二维数组副本中的更改反射(reflect)在原始数组中

Java - 通过 3 个点构建样条线

java - 将子包移动到新包后@Autowire 不起作用

android - 单击 ListView 项时播放声音

java - 将 GWT 与 Spring 集成

android - 关于这个 UI 实现的建议?

android - 偏好点击监听器上的偏好 Activity

git - 可以 merge 可穿戴设备和移动 Git 存储库

java - 在Android中执行一次异步任务

android - 有没有办法可视化使用 Android Studio 开发的 Flutter 应用程序中的特定 UI 元素?