gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:58:39 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com