【发布时间】: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
}
这非常有效。但是,我不能将它用于例如AlertDialog 的setIcon(),因为它需要Drawable 作为整数,例如setIcon(R.dawable.my_icon)。
我需要一个与上面类似的函数,它做的事情完全相同,但将Drawable 作为整数返回。我怎样才能做到这一点?
【问题讨论】:
-
你将无法做到这一点。
R.drawable指的是从中创建Drawable的资源,这是一种单向操作。您不能将Drawable反转回资源,然后为其分配一个 ID,原因之一是您无法在运行时创建资源。不过,我要提一下,AlertDialog确实有asetIcon(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