4

我想显示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作为矢量图形资产,但png.

在 26 级及以上的 Android 设备上,这会产生:

图1

正如预期的那样,而在设备 lvl 25 上,图像不可见:

图2

有人知道原因以及是否有解决方法吗?

PS:你可以在这里查看我的测试项目:https ://github.com/fmweigl/SpannableTest

4

1 回答 1

3

这是由于textAllCaps奥利奥之前版本的错误。那Button是默认样式将属性设置为true,这只会导致Button' 的文本被转换为全部大写。该转换是使用平台AllCapsTransformationMethod类完成的,在 Nougat 7.1 及更低版本上,它将所有内容都视为 flat Strings,基本上剥离了您设置的任何格式跨度。

解决方法是关闭该属性,并在代码中处理您自己可能需要的任何大写转换。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>

(如果您使用的是 Material Components 主题,则parentforNoCapsButton应该是Widget.MaterialComponents.Button.TextButton.Snackbar。)


在这种特定情况下,这就是您需要做的所有事情,因为没有要转换的文本。

于 2020-07-14T02:02:34.430 回答