【问题标题】:Html.fromHtml in DataBinding - Android数据绑定中的 Html.fromHtml - Android
【发布时间】:2017-05-10 08:13:44
【问题描述】:

我在我的项目中使用dataBinding,当我有下面xml 时,它做得很好:

    <TextView
        android:id="@+id/txtDateCreate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{String.format(@string/DateCreate,others.created)}" />

但是当我更改为波纹管时,我会崩溃:

    <TextView
        android:id="@+id/txtDateCreate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{Html.fromHtml(String.format(@string/DateCreate,others.created))}" />

在我的string.xml 中:

<resources>
<string name="DateCreate">open : <![CDATA[<b><font color=#FF0000>%s</b>]]></string>
</resources>

【问题讨论】:

    标签: android android-databinding


    【解决方案1】:

    认为需要先在xml中导入html

    <data>
        <import type="android.text.Html"/>
    </data>
    
    <TextView
        android:id="@+id/txtDateCreate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{Html.fromHtml(String.format(@string/DateCreate,others.created))}" />
    

    【讨论】:

    • 我正在尝试实现您的解决方案,但我得到的文本来自 API 调用,因此在屏幕的第一次初始化时,字符串为 null 并且应用程序崩溃,我该如何实现它解决这个问题?
    【解决方案2】:

    我认为视图不应该有任何逻辑/转换来显示数据。我建议做的是为此创建一个 BindingAdapter:

    @BindingAdapter({"android:htmlText"})
    public static void setHtmlTextValue(TextView textView, String htmlText) {
        if (htmlText == null)
            return;
    
        Spanned result;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            result = Html.fromHtml(htmlText, Html.FROM_HTML_MODE_LEGACY);
        } else {
            result = Html.fromHtml(htmlText);
        }
        textView.setText(result);
    }
    

    然后在布局中照常调用它:

    <TextView
                    android:id="@+id/bid_footer"
                    style="@style/MyApp.TextView.Footer"
                    android:htmlText="@{viewModel.bidFooter} />
    

    viewModel.bidFooter 具有获取带有文本的 String/Spanned/Chars 的逻辑,考虑到不直接依赖于上下文、活动等

    【讨论】:

    • 如果要直接使用字符串资源ID怎么办? IE。没有视图模型。
    • 这就像在活动/片段或 util/ktx 类中包含所有逻辑......然后在获得数据值后,在布局中定义数据绑定变量并设置来自活动/片段的价值
    【解决方案3】:

    以下行在 Android N(API 级别 24)中已弃用。

    Html.fromHtml(content)
    

    现在您应该提供两个参数(内容和标志),如下所示:

    Html.fromHtml(content, HtmlCompat.FROM_HTML_MODE_LEGACY)
    

    所以我建议你使用 @BindingAdapter,如下所示:

    object BindingUtils {
    
    @JvmStatic
    @BindingAdapter("loadHtml")
    fun loadHtml(textView: TextView, content: String?){
        if (!content.isNullOrEmpty()) {
            textView.text = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
                Html.fromHtml(content, HtmlCompat.FROM_HTML_MODE_LEGACY)
            } else {
                Html.fromHtml(content)
            }
        }
    }
    

    }

    在您的 XML 文件中:

     <data>
        <import type="com.example.utils.BindingUtils"/>
    </data>
    <TextView
            android:id="@+id/textView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:loadHtml="@{String.format(@string/DateCreate,others.created))}"/>
    

    【讨论】:

    • 有用的答案!需要注意的几点: 1) HtmlCompat.fromHtml(content, HtmlCompat.FROM_HTML_MODE_LEGACY) 可以用来避免检查SDK版本的需要。 2)对于string.xml资源,需要对Html标签或其左括号'
    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2019-02-23
    相关资源
    最近更新 更多