【问题标题】:How to return a Drawable asset as Integer?如何将可绘制资产作为整数返回?
【发布时间】:2020-05-25 04:41:16
【问题描述】:

在我的应用程序中,我使用此函数返回 Drawable 女巫改变颜色:

fun setDrawableColor(icon: Drawable, color: Int): Drawable {
    val drawable = DrawableCompat.wrap(icon)
    DrawableCompat.setTint(drawable, getColor(color))
    return drawable
}

这非常有效。但是,我不能将它用于例如AlertDialogsetIcon(),因为它需要Drawable 作为整数,例如setIcon(R.dawable.my_icon)

我需要一个与上面类似的函数,它做的事情完全相同,但将Drawable 作为整数返回。我怎样才能做到这一点?

【问题讨论】:

  • 你将无法做到这一点。 R.drawable 指的是从中创建 Drawable 的资源,这是一种单向操作。您不能将 Drawable 反转回资源,然后为其分配一个 ID,原因之一是您无法在运行时创建资源。不过,我要提一下,AlertDialog 确实有a setIcon(Drawable) method,它接受Drawable 而不是R.drawable
  • 没有直接的函数可以做到这一点,为什么不直接传递drawable而不是int呢?如果您想将可绘制名称作为参数传递,那么有一种方法:stackoverflow.com/a/13115927/2462531
  • @ShylendraMadda 提出的解决方案效果很好。请看下面。
  • 这不是你想象的那样。默认情况下,从同一资源创建的Drawable 实例将共享一个公共的缓存状态,除非另有明确配置。该示例基本上是从该资源加载Drawable,为它创建一个公共状态,然后只是丢弃Drawable 本身。该缓存状态是导致由AlertDialog 创建的单独Drawable 实例具有给定色调的原因。资源 ID 查找没有做任何事情,因为您可以通过传递过去的 R.drawable.my_icon 来完成同样的事情...
  • ...首先创建Drawable。也就是说,您可以简单地首先从R.drawable.my_icon 创建Drawable,调用您的setDrawableColor() 方法,然后调用AlertDialog#setIcon(R.drawable.my_icon)。如果您在任何给定时间只显示该特定图标一次,它可能对您有用,但还有其他可以说是更可取的解决方案;例如,改用setIcon(Drawable) 方法。实际上,大多数采用可绘制资源 ID 的框架方法都有一个采用 Drawable 实例的重载。

标签: android kotlin android-drawable


【解决方案1】:

您可以尝试这种方式,但您需要在此处将可绘制名称作为参数传递

fun getDrawableColorAsInt(icon: Drawable, color: Int, drawableName: String): Int {
        val drawable = DrawableCompat.wrap(icon)
        DrawableCompat.setTint(drawable, context!!.getColor(color))
        val resourceID = resources.getIdentifier(drawableName, "drawable", context!!.packageName)
        return resourceID
    }

【讨论】:

  • 非常感谢您的回复。您的解决方案有效,但是,它看起来不是一个优雅的解决方案,因为您必须将可绘制名称作为参数传递。尽管如此,它仍然有效。谢谢!
  • 我现在有一个问题,它不适用于 Android Marshmallow 及以下版本。任何想法兄弟,如何强制它在那些Android版本上工作?谢谢!
猜你喜欢
  • 2020-05-09
  • 2018-02-27
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多