我正在尝试使用 <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/