Android + 数据绑定@style
Android + Data Binding @style
在使用新的数据绑定 api 时,我发现您无法绑定到 "style" 属性。编译器抱怨找不到样式。但是,如果我简单地按原样设置样式,它会发现它很好。例如:
无效:
style="@{TextUtils.isEmpty(row.getSubtitle()) ? @style/SubTitle : @style/Title}"
有效:
style="@style/SubTitle"
错误:
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Identifiers must have user defined types from the XML file. SubTitle is missing it file:/~/test/app/src/main/res/layout/row.xml loc:48:71 - 48:78 ****\ data binding error ****
不幸的是,样式不支持数据绑定:
https://code.google.com/p/android-developer-preview/issues/detail?id=2613
虽然@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}"
我在我的代码中使用了这个,基于一个很棒的post:https://plus.google.com/+LisaWrayZeitouni/posts/LTr5tX5M9mb
我找到了一个相当优雅的解决方案来应用带有数据绑定的样式。我使用 Paris library 然后为感兴趣的视图创建绑定适配器。例如:
@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
额外说明
您也可以直接为 View
class 创建一个通用的 bindStyle
绑定适配器,但在那种情况下,属性项专门用于文本视图(textColor
例如)将不会被应用。所以由你来找到正确的平衡和命名。
在使用新的数据绑定 api 时,我发现您无法绑定到 "style" 属性。编译器抱怨找不到样式。但是,如果我简单地按原样设置样式,它会发现它很好。例如:
无效:
style="@{TextUtils.isEmpty(row.getSubtitle()) ? @style/SubTitle : @style/Title}"
有效:
style="@style/SubTitle"
错误:
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Identifiers must have user defined types from the XML file. SubTitle is missing it file:/~/test/app/src/main/res/layout/row.xml loc:48:71 - 48:78 ****\ data binding error ****
不幸的是,样式不支持数据绑定: https://code.google.com/p/android-developer-preview/issues/detail?id=2613
虽然@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}"
我在我的代码中使用了这个,基于一个很棒的post:https://plus.google.com/+LisaWrayZeitouni/posts/LTr5tX5M9mb
我找到了一个相当优雅的解决方案来应用带有数据绑定的样式。我使用 Paris library 然后为感兴趣的视图创建绑定适配器。例如:
@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
额外说明
您也可以直接为 View
class 创建一个通用的 bindStyle
绑定适配器,但在那种情况下,属性项专门用于文本视图(textColor
例如)将不会被应用。所以由你来找到正确的平衡和命名。