Почему добавление ImageSpan к тексту действия Snackbar работает на Android устройствах SDK 26 уровня, но не на SDK 25 уровня? - PullRequest
4 голосов
/ 09 июля 2020

Я хочу показать Snackbar и использовать изображение вместо текста для действия.

Я использую следующий код:

    val imageSpan = ImageSpan(this, R.drawable.star)
    val builder = SpannableStringBuilder(" ")
    builder.setSpan(
        imageSpan,
        0,
        1,
        SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE
    )
    Snackbar.make(findViewById(R.id.container), "Hello Snackbar", Snackbar.LENGTH_INDEFINITE)
        .setAction(builder) {}.show()

drawable_star является векторным графиком c, но то же самое происходит с png.

На устройстве Android 26 уровня и выше это дает:

pic1

as expected, whereas on device lvl 25 the image is not visible:

pic2

Does someone know the reason for this and if there a workaround?

PS: You can check out my test project here: https://github.com/fmweigl/SpannableTest

1 Ответ

2 голосов
/ 14 июля 2020

Это связано с ошибкой textAllCaps в версиях до Oreo. Этот стиль по умолчанию Button будет иметь этот атрибут, установленный на true, что просто приводит к преобразованию текста Button в верхний регистр. Это преобразование выполняется с помощью класса платформы AllCapsTransformationMethod, который в Nougat 7.1 и ниже будет рассматривать все как плоские String s, по существу удаляя все установленные вами интервалы форматирования.

Исправление заключается в отключите этот атрибут и обработайте любое преобразование в верхний регистр, которое может вам понадобиться, в коде. Snackbar предлагает атрибут snackbarButtonStyle как средство стилизации действия Button, и мы можем создать простой стиль для изменения этого значения. Например, из вашего styles.xml:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="snackbarButtonStyle">@style/NoCapsButton</item>>
</style>

<style name="NoCapsButton" parent="Widget.AppCompat.Button">
    <item name="textAllCaps">false</item>
</style>

(если вы используете тему компонентов материала, вместо parent для NoCapsButton должно быть Widget.MaterialComponents.Button.TextButton.Snackbar.)

В данном случае c это все, что вам нужно сделать, поскольку нет текста для преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...