Android +数据绑定@style

nvbavucw  于 2023-03-28  发布在  Android
关注(0)|答案(4)|浏览(121)

在使用新的数据绑定API时,我发现你不能绑定到“style”属性。编译器抱怨它找不到样式。但是,如果我简单地设置样式,它会找到它。例如:

不工作:

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

作品:

style="@style/SubTitle"

错误:

错误:任务“:app:compileDebugJavaWithJavac”的执行失败。
java.lang.RuntimeException:发现数据绑定错误。/数据绑定错误msg:标识符必须具有XML文件中的用户定义类型。SubTitle缺少它file:/~/test/app/src/main/res/layout/row.xml loc:48:71 - 48:78****\数据绑定错误****

chy5wohz

chy5wohz2#

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

okxuctiv

okxuctiv3#

我发现了一个相当优雅的解决方案,用于在数据绑定中应用样式。我使用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类创建一个通用的bindStyle绑定适配器,但在这种情况下,专门用于textviews的属性项(例如textColor)将不会被应用。因此,由您来找到正确的平衡和命名。

waxmsbnn

waxmsbnn4#

现在,我们可以这样设置样式:

android:textAppearance='@{viewModel.messageCount > 0 ? R.style.B5_error : R.style.B5_error}'

别忘了从你的项目中导入“R”。
正确

<import type="com.company.project.R" />

不正确:

<import type="android.R"/>

相关问题