使用 DataBinding 将文本的某些部分加粗
Make certain part of text bold using DataBinding
我想将文本的某些部分加粗,其值是使用 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"
/>
当前通过设置 binding.setProductPrice(Object.getPrice())
使用带绑定的 ViewModel 传递产品价格
我知道以下解决方案:但想尝试使用 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
您可以将绑定适配器与 SpannableString 结合使用。定义绑定适配器后,您可以在所有布局文件中重复使用它。
@BindingAdapter({"mainText", "priceToFormat"})
public static void format(TextView textView, String mainText, float
productPrice){
//Use spannable string to format your text accordingly
textView.setText(formattedText);
}
您可以像这样在布局文件中传递这些参数:
<TextView
.
.
app:mainText = "@{ priceText }"
app:priceToFormat = "@{ price }"/>
祝你好运。
// 将此方法放入您的模型中 class 其中名称是根据给定 api 响应
设置的字符串变量
public Spanned getHtmlText(){
return Html.fromHtml("<b>" + name + "</b>");
}
// 在 xml 中使用它,其中 userList 是模型 class 的变量名称。
android:text="@{userList.htmlText}"
根据@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>
您必须创建 BindingAdapter
和 SpannableStringBuilder
.
Binding Adapter
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
}
}
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 0 for your pair`}"
app:secondText="@{`0`}"
android:textColor="@color/black"
android:textSize="22sp" />
可能对你有帮助。
使用下面提到的 BindingAdapter
@BindingAdapter("setBold")
@JvmStatic
public static void setBold(TextView view, boolean isBold) {
if (isBold) {
view.setTypeface(null, Typeface.BOLD);
} else {
view.setTypeface(null, Typeface.NORMAL);
}
}
并在 xml 中使用它,如下所示:
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{model.value}"
app:setBold="@{model.isBold}"
/>
由于 Html.fromHtml 签名在 API 级别 24 (Android N) 更改,Android 团队引入了 HtmlCompat 以在任何 api级。
因此,您应该使用 HtmlCompat class:
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
要使用它,您可以在项目的 build.gradle:
中包含 AndroidX 核心
implementation 'androidx.core:core:1.3.1'
布局XML文件:
<?xml version="1.0" encoding="utf-8"?>
<layout
<data>
<import type="androidx.core.text.HtmlCompat"/>
<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="@{HtmlCompat.fromHtml(@string/product_price(productPrice),HtmlCompat.FROM_HTML_MODE_LEGACY)}"
android:textColor="@color/button_tertiary"
android:visibility="@{productPrice > 0}"
style="@style/Body.Small"
/>
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>
</layout>
我想将文本的某些部分加粗,其值是使用 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"
/>
当前通过设置 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
您可以将绑定适配器与 SpannableString 结合使用。定义绑定适配器后,您可以在所有布局文件中重复使用它。
@BindingAdapter({"mainText", "priceToFormat"})
public static void format(TextView textView, String mainText, float
productPrice){
//Use spannable string to format your text accordingly
textView.setText(formattedText);
}
您可以像这样在布局文件中传递这些参数:
<TextView
.
.
app:mainText = "@{ priceText }"
app:priceToFormat = "@{ price }"/>
祝你好运。
// 将此方法放入您的模型中 class 其中名称是根据给定 api 响应
设置的字符串变量public Spanned getHtmlText(){
return Html.fromHtml("<b>" + name + "</b>");
}
// 在 xml 中使用它,其中 userList 是模型 class 的变量名称。
android:text="@{userList.htmlText}"
根据@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>
您必须创建 BindingAdapter
和 SpannableStringBuilder
.
Binding Adapter
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
}
}
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 0 for your pair`}"
app:secondText="@{`0`}"
android:textColor="@color/black"
android:textSize="22sp" />
可能对你有帮助。
使用下面提到的 BindingAdapter
@BindingAdapter("setBold")
@JvmStatic
public static void setBold(TextView view, boolean isBold) {
if (isBold) {
view.setTypeface(null, Typeface.BOLD);
} else {
view.setTypeface(null, Typeface.NORMAL);
}
}
并在 xml 中使用它,如下所示:
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{model.value}"
app:setBold="@{model.isBold}"
/>
由于 Html.fromHtml 签名在 API 级别 24 (Android N) 更改,Android 团队引入了 HtmlCompat 以在任何 api级。
因此,您应该使用 HtmlCompat class:
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
要使用它,您可以在项目的 build.gradle:
中包含 AndroidX 核心implementation 'androidx.core:core:1.3.1'
布局XML文件:
<?xml version="1.0" encoding="utf-8"?>
<layout
<data>
<import type="androidx.core.text.HtmlCompat"/>
<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="@{HtmlCompat.fromHtml(@string/product_price(productPrice),HtmlCompat.FROM_HTML_MODE_LEGACY)}"
android:textColor="@color/button_tertiary"
android:visibility="@{productPrice > 0}"
style="@style/Body.Small"
/>
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>
</layout>