当前位置: 首页 > 知识库问答 >
问题:

Android数据绑定@style

唐星晖
2023-03-14

在使用新的数据绑定api时,我发现无法绑定到“style”属性。编译器抱怨找不到样式。然而,如果我简单地将样式设置为原样,它会发现它很好。例如:

不工作:

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

作品:

style="@style/SubTitle"

错误:

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

JAVAlang.RuntimeException:发现数据绑定错误。****/数据绑定错误****msg:标识符必须具有XML文件中的用户定义类型。字幕缺少它的文件:/~/test/app/src/main/res/layout/row。xml loc:48:71-48:78****\data binding error****

共有3个答案

白芷阳
2023-03-14

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

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

然后在XML中:

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

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

priceStyleResource.value = R.style.QuoteDetailsHeaderItem_Up

附加说明

您也可以直接为视图类创建一个通用的bindStyle绑定适配器,但在这种情况下,将不会应用专门用于TextView的属性项(例如textColor)。因此,你需要找到正确的平衡和命名。

晁文斌
2023-03-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/帖子/LTr5tX5M9mb

雷晋
2023-03-14

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

 类似资料:
  • 我想知道以下内容之间有什么区别: 与 有任何性能差异吗? 每个的首选用例是什么? 任何其他信息都将不胜感激! 谢谢!

  • style绑定为元素添加一个或多个样式,如果需要绑定css,请参考style绑定。 示例代码: //.W片段 //&lt; 是<的转义符 <div bind-style="{ color: currentProfit.get() &lt; 0 ? 'red' : 'black' }"> Profit Information </div> //.js片段 //初始正值,div里的内容为黑色 t

  • 问题内容: 我需要能够动态设置EditText的height属性。我在整个应用程序中都将数据绑定用于其他属性,因此,我希望能够使用数据绑定来控制元素的高度。这是我的xml的精简版本: 这是我的视图模型的精简版: 尺寸在dimens.xml文件中。我正在修改视图模型中的属性。但是,当我启动该应用程序时,我在启动后立即收到以下错误消息(bindingadapter不会在调试时触发)。我在屏幕上还有其他

  • 数据绑定 JXML 中的动态数据来自于该 Page 的 data字段。 简单绑定 数据绑定使用 Mustache 语法(双大括号)将变量包起来,可以作用于以下: 页面内容 <view> hello {{ name }} </view> Page({ data: { name: 'cortana' } }) 组件属性(需要在双引号之内) <view id="{{id}}"> </

  • attr绑定是用来为html元素绑定属性值的,这种绑定非常有用,例如我们需要想一个元素添加title属性,或者为img标签添加src属性。 示例代码: //.W片段 <a bind-attr="{ href: url, title: details }"> Report </a> //js片段 this.url=justep.Bind.observable("year-end.html"),

  • submit绑定只能用在form元素中,当form提交的时候被触发,并且默认阻止form的提交。因此我们通常在submit的处理函数中以ajax的方式提交form表单。 示例代码: //.W片段 <form bind-submit="doSomething"> ... form contents go here ... <button type="submit">Submit</butt