使用DataBinding将文本的某些部分加粗

Vik*_*tel 5 android android-databinding android-mvvm

我想将文本的某些部分设置为粗体,其值是通过使用DataBinding和ViewModel设置的。

例如

如果您被选中,则将为您的一对支付160美元

我正在使用字符串资源

<string name="product_price">If you are selected, you will have to pay $%d for your pair.</string>

<TextView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_marginEnd="@dimen/spacing_xlarge"
          android:layout_marginStart="@dimen/spacing_xlarge"
          android:layout_marginBottom="@dimen/spacing_small"
          android:text="@{@string/product_price(productPrice)}"
          android:textColor="@color/button_tertiary"
          android:visibility="@{productPrice > 0}"
          style="@style/Body.Small"
          />
Run Code Online (Sandbox Code Playgroud)

当前通过ViewModel和Binding通过设置传递产品价格 binding.setProductPrice(Object.getPrice())

我知道以下解决方案:但想尝试使用DataBinding

  • 使用HTML文本-但不想在代码中使用它。
  • 在水平样式中使用其他TextView。将样式设置为该产品价格的粗体。-实在不好
  • 使用SpannableString-但不想在代码中使用它。

但是上述所有解决方案都是解决方法。

题 ::

Want to try DataBinding feature which can be used to style certain part of string. Just like SpannableString

Manipulate String in the Layout file using DataBinding

小智 7

您必须创建一个BindingAdapterand SpannableStringBuilder

绑定适配器

object Util {
    @BindingAdapter("main","secondText")
        @JvmStatic
        fun setBoldString(view: AppCompatTextView, maintext: String,sequence: String) {
            view.text = Util.getBoldText(maintext, sequence)
        }



    @JvmStatic
        fun getBoldText(text: String, name: String): SpannableStringBuilder {
            val str = SpannableStringBuilder(text)
            val textPosition = text.indexOf(name)
            str.setSpan(android.text.style.StyleSpan(Typeface.BOLD),
                    textPosition, textPosition + name.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            return str
        }
}
Run Code Online (Sandbox Code Playgroud)

XML

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:main="@{`you will pay $160 for your pair`}"
        app:secondText="@{`$160`}"
        android:textColor="@color/black"
        android:textSize="22sp" />
Run Code Online (Sandbox Code Playgroud)

也许它对你有帮助。


Vik*_*tel 6

根据@CommonsWare,

尝试通过添加基本的 Html 标签 <string name="product_price">If you are selected, you will have to pay <![CDATA[<b>$%d</b>]]> for your pair.</string>

布局文件:导入的 Html

 <?xml version="1.0" encoding="utf-8"?>
 <layout
   <data>
   <import type="android.text.Html"/>
   <data>
     <LinearLayout>
       <android.support.design.widget.CoordinatorLayout>
       <TextView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_marginEnd="@dimen/spacing_xlarge"
          android:layout_marginStart="@dimen/spacing_xlarge"
          android:layout_marginBottom="@dimen/spacing_small"
          android:text="@{Html.fromHtml(@string/product_price(productPrice))}"
          android:textColor="@color/button_tertiary"
          android:visibility="@{productPrice > 0}"
          style="@style/Body.Small"
          />
       </android.support.design.widget.CoordinatorLayout>
     </LinearLayout>
 </layout>
Run Code Online (Sandbox Code Playgroud)