49

在使用新的数据绑定 api 时,我发现您无法绑定到“样式”属性。编译器抱怨它找不到样式。但是,如果我只是按原样设置样式,它会发现它很好。例如:

不起作用:

style="@{TextUtils.isEmpty(row.getSubtitle()) ? @style/SubTitle : @style/Title}"

作品:

style="@style/SubTitle"

错误:

错误:任务“:app:compileDebugJavaWithJavac”执行失败。

java.lang.RuntimeException:发现数据绑定错误。****/ 数据绑定错误 ****msg:标识符必须具有来自 XML 文件的用户定义类型。SubTitle is missing it file:/~/test/app/src/main/res/layout/row.xml loc:48:71 - 48:78 ****\ data binding error ****

4

3 回答 3

47

不幸的是,样式不支持数据绑定: https ://code.google.com/p/android-developer-preview/issues/detail?id=2613

于 2015-08-14T15:34:18.493 回答
14

尽管@bwhite 是正确的,但您可以采取一些变通方法。这取决于你需要有条件地改变什么。例如,如果您想根据条件更改字体(我需要这样做),您可以通过制作自定义绑定适配器来实现。

换句话说,做这样的事情:

public class FontBindingAdapter {

    @BindingAdapter({"bind:font"})
    public static void setFont(TextView textView, String typefaceName){
        Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);
        // You'd probably want to actually use `typefaceName` to determine the font to use 
        textView.setTypeface(typeface);
    }

然后在您的布局中,如下所示:

<TextView
   app:font="@{some_condition ? @string/typeface_string_name_bold: @string/typeface_string_name_bold_light}"

我在我的代码中使用了这个,基于一篇很棒的帖子: https: //plus.google.com/+LisaWrayZeitouni/posts/LTr5tX5M9mb

于 2016-06-28T19:51:01.787 回答
3

我找到了一个相当优雅的解决方案,可以将样式与数据绑定一起应用。我使用Paris 库 ,然后为感兴趣的视图创建绑定适配器。例如:

@BindingAdapter("bindTextViewStyle")
fun TextView.bindTextViewStyle(styleResourceId: Int) {
    this.style(styleResourceId)
}

然后在 XML 中:

<TextView
    app:bindTextViewStyle="@{viewModel.priceStyleResource}"
    .../>

viewModel.priceStyleResource是我的视图模型中的 MutableLiveData,它使用样式资源 ID 设置。

priceStyleResource.value = R.style.QuoteDetailsHeaderItem_Up

额外说明

您也可以bindStyle直接为View该类制作一个通用绑定适配器,但在这种情况下,专门用于 textviews 的属性项(textColor例如)将不会被应用。所以由你来找到合适的平衡和命名。

于 2020-09-22T12:37:19.610 回答