使用新的数据绑定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 ****
答案 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
) 。因此,由您自己决定合适的平衡和命名。