Android HtmlCompat.тег fromHtml не работает

#android

Вопрос:

У меня есть такой html-код цены с сервера

 <del><span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">amp;#8377;</span>12,000.00</span></del> <ins><span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">amp;#8377;</span>3,999.00</span></ins>
 

Я использую HTMLCompact для визуализации в textview

 HtmlCompat.fromHtml(description, HtmlCompat.FROM_HTML_MODE_COMPACT)
 

Но текст скидки не зачеркнут. Тег Del полностью исключен.

Реализация кода в соответствии с запросом

 <TextView
   android:id="@ id/course_name"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginTop="16dp"
   android:fontFamily="@font/open_sans_semi_bold"
   app:renderHtmlText="@{viewModel.product.priceHtml}"
   android:textSize="18sp"  />


//Binding Adapter
@BindingAdapter("renderHtmlText")
fun bindRenderHtmlText(view: TextView, description: String?) {
    if (description != null) {
        view.text = HtmlCompat.fromHtml(description, HtmlCompat.FROM_HTML_MODE_COMPACT)
    } else {
        view.text = ""
    }
}
 

Комментарии:

1. На каком уровне API вы запускаете код?

2. targetSdkVersion 30 и приложение, работающее на Android версии 7.1.2

3. Вы пробовали простое <del>12,000.00</del> ? ИОУ, это ваша проблема <del> или ваша проблема <del> с двумя вложенными <span> тегами?

4. @CommonsWare обычно это нормально работает проблема с вложенным промежутком

5. Вам придется опубликовать больше кода. Там может быть дополнительное toString() или что-то еще, что удаляет форматирование.

Ответ №1:

Основываясь на логике handleEndTag исходного кода платформы Android, внешний del тег может игнорироваться внутренним span тегом.

Предлагаемое решение-добавить встроенный стиль style="text-decoration: line-through; для совместимости, как показано ниже.

 <del>
    <span class="woocommerce-Price-amount amount" style="text-decoration: line-through;">
        <span class="woocommerce-Price-currencySymbol">amp;#8377;</span>12,000.00
    </span>
</del>
<ins><span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">amp;#8377;</span>3,999.00</span>
 

Или измените структуру своей html-страницы, чтобы сделать del тег внутри span тега.

 <span class="woocommerce-Price-amount amount">
        <span class="woocommerce-Price-currencySymbol"><del>amp;#8377;</del></span><del>12,000.00</del>
</span>
<ins><span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">amp;#8377;</span>3,999.00</span>
</ins>
 

Комментарии:

1. На самом деле этот api создан woocommrce, я не могу изменить его со стороны сервера.

2. Можете ли вы изменить description текст при рендеринге?

3. description.replaceFirst("<span", "<span style="text-decoration: line-through;"")

4. Мне это кажется правильным и похоже на ошибку. Я добавлю, что ни «<del><del></del>», ни «</del> » не поддерживаются до API 24. (Пожалуйста, поправьте меня, если я ошибаюсь в этом.) Для поддержки API до API 24 более полным решением было бы выполнить описанное выше для API 24 и реализовать Html. TagHandler для API ниже 24.

5. С настроенными Html.TagHandler звуками разумное решение для совместимости.