Android +数据绑定@style

时间:2015-08-13 05:46:30

标签: android

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

不起作用:

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

如下:

style="@style/SubTitle"

错误:

  

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

     
    

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

  

3 个答案:

答案 0 :(得分:26)

答案 1 :(得分:9)

虽然@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

答案 2 :(得分:1)

我发现了一个相当优雅的解决方案,用于通过数据绑定应用样式。我使用Paris library,然后为感兴趣的视图创建绑定适配器。例如:

select avg(case when HeightType = 1 then (height * 2) else height end) as avg_height 
from table_name

,然后使用XML:

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

<TextView app:bindTextViewStyle="@{viewModel.priceStyleResource}" .../> 是我的视图模型中的MutableLiveData,使用样式资源ID设置。

viewModel.priceStyleResource

额外提示

您也可以直接为priceStyleResource.value = R.style.QuoteDetailsHeaderItem_Up 类制作一个通用的bindStyle绑定适配器,但是在这种情况下,将不会应用专门用于文本视图的属性项(例如View) 。因此,由您自己决定合适的平衡和命名。