首页 > 解决方案 > Android BindingAdapter 将可变数量的参数(vararg)作为参数

问题描述

我有两个 int 变量(myRank、totalRanks)来显示我的应用程序中的当前排名,例如:

排名:2/10

因为我的字符串模板很复杂(仍然是%d/%d但采用HTML 格式,带有字体大小、字体颜色),而不是

<androidx.appcompat.widget.AppCompatTextView
    android:text="@{@string/text_current_rank(myRank, totalRanks)}"
/>

我必须创建一个自定义 BindingAdapter:

@BindingAdapter("android:htmlText")
fun setHtmlText(view: TextView, text: String) {
    view.text = HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_LEGACY)
}

xml 布局绑定看起来更好:

<androidx.appcompat.widget.AppCompatTextView
    android:htmlText="@{@string/text_current_rank(myRank, totalRanks)}"
/>

它正常工作。但是,我想创建一个更具体的 BindingAdapter,例如:

@BindingAdapter("android:textRank")
fun setTextRank(view: TextView, vararg args: Int) {
    view.text = HtmlCompat.fromHtml(
            view.context.getString(R.string.text_current_rank, args),
            HtmlCompat.FROM_HTML_MODE_LEGACY)
}

接着:

<androidx.appcompat.widget.AppCompatTextView
    android:textRank="@{ ??? }" // pass myRank, totalRanks as arguments
/>

是的,问题是关于将 vararg 作为 BindingAdapter 参数。这(以及如何)可能吗?注意:我不想使用类包装器(RankDetail 包含 myRank、totalRanks)或两个 BindingAdapter 参数,例如:

@BindingAdapter("android:myRank", "android:totalRanks")
fun setTextRank(view: TextView, myRank: Int, totalRanks: Int) {
    view.text = HtmlCompat.fromHtml(
            view.context.getString(R.string.text_current_rank, myRank, totalRanks),
            HtmlCompat.FROM_HTML_MODE_LEGACY)
}

标签: androidxmlbinding

解决方案


推荐阅读