对于新的android API 22,getResources().getDrawable()现在已被弃用。现在最好的方法是只使用getDrawable()。

什么改变了?


当前回答

编辑:查看我的博客文章以获得更完整的解释


您应该使用支持库中的以下代码:

ContextCompat.getDrawable(context, R.drawable.***)

使用此方法相当于调用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

从API 21开始,您应该使用getDrawable(int,Theme)方法而不是getDrawble(int)方法,因为它允许您获取与给定屏幕密度/主题的特定资源ID相关联的可绘制对象。调用不推荐使用的getDrawable(int)方法等同于调用getDrawble(int,null)。

其他回答

en-api级别14

marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));

getResources().getDrawable()在API级别22中被弃用。现在我们必须添加主题:

getDrawable(int id,Resources.Theme主题)(在API级别21中添加)

这是一个示例:

myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));

以下是如何验证更高版本的示例:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
   } else { 
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}

对于一些即使在应用了这个线程的建议(我以前也是这样的)之后仍然需要解决这个问题的人,请在Application类上添加这行,onCreate()方法

AppCompatDelegate.setComptVectorFromResourcesEnabled(true)

正如这里和这里所建议的,有时需要从资源中访问向量,尤其是在处理菜单项等时

编辑:查看我的博客文章以获得更完整的解释


您应该使用支持库中的以下代码:

ContextCompat.getDrawable(context, R.drawable.***)

使用此方法相当于调用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

从API 21开始,您应该使用getDrawable(int,Theme)方法而不是getDrawble(int)方法,因为它允许您获取与给定屏幕密度/主题的特定资源ID相关联的可绘制对象。调用不推荐使用的getDrawable(int)方法等同于调用getDrawble(int,null)。

在Kotlin,您可以使用扩展

fun Context.getMyDrawable(id : Int) : Drawable?{

    return  ContextCompat.getDrawable(this, id)
}

然后使用like

context.getMyDrawable(R.drawable.my_icon)