Android getResources(). getDrawable()不建议使用的API 22

使用新的Android API 22getResources().getDrawable()现在已弃用。现在最好的方法是只使用getDrawable()

什么变了?

464296 次浏览

编辑:请参阅主题上的我的博客文章以获得更完整的解释


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

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)方法而不是getDrawable(int),因为它允许您获取与给定屏幕密度/主题的特定资源ID关联的可绘制对象。调用不建议使用的getDrawable(int)方法等效于调用getDrawable(int, null)

替换这一行:getResources().getDrawable(R.drawable.your_drawable)

ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

编辑

ResourcesCompat现在也被弃用了。但是你可以使用这个:

ContextCompat.getDrawable(this, R.drawable.your_drawable)(这里this是上下文)

有关详细信息,请点击此链接:ContextCompat数据库

您有一些选项可以以正确(和未来证明)的方式处理此弃用,具体取决于您正在加载的绘图类型:


(一)可绘制主题属性

ContextCompat.getDrawable(getActivity(), R.drawable.name);

您将获得一个样式的Drawable作为您的活动主题指示。这可能是你需要的。


B)可绘制没有主题属性

ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

您将以旧方式获得无样式的绘图。请注意:ResourcesCompat.getDrawable()已弃用没有


EXTRA)可绘制来自另一个主题的主题属性

ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);

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

getDrawable(int id,资源主题)(在API级别21中添加)

这是一个例子:

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

这是一个如何验证更高版本的示例:

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

Build.VERSION_CODES.LOLLIPOP现在应该改为BuildVersionCode. Lollipop即:

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);} else {this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);}

只是一个例子,说明我如何在数组中修复问题以加载listView,希望它有所帮助。

 mItems = new ArrayList<ListViewItem>();//    Resources resources = getResources();
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));

您可以使用

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

这对我来说是工作

试试这个:

public static List<ProductActivity> getCatalog(Resources res){if(catalog == null) {catalog.add(new Product("Dead or Alive", res.getDrawable(R.drawable.product_salmon),"Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));catalog.add(new Product("Switch", res.getDrawable(R.drawable.switchbook),"Switch by Chip Heath and Dan Heath", 24.99));catalog.add(new Product("Watchmen", res.getDrawable(R.drawable.watchmen),"Watchmen by Alan Moore and Dave Gibbons", 14.99));}}

enapi级别14

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

如果您的目标SDK>21(棒棒糖或5.0),请使用

context.getDrawable(R.drawable.your_drawable_name)

查看文档

现在你需要像这样执行

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21//} else {//}

遵循一行代码就足够了,一切都将由ContextCompat.getDrawable处理

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)

获取可绘制的在API级别22中已弃用。请参阅此链接

现在要解决这个问题,我们必须传递一个新的构造器和id,如:-

getDrawable(int id, Resources.Theme theme)

对于解决方案这样做:-

Java:

ContextCompat.getDrawable(getActivity(), R.drawable.name);

 imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));

静态编程语言:-

rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)

 rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)

希望对你有帮助,谢谢。

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

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

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

在静态编程语言中,您可以使用扩展

fun Context.getMyDrawable(id : Int) : Drawable?{
return  ContextCompat.getDrawable(this, id)}

然后使用like

context.getMyDrawable(R.drawable.my_icon)

如果您需要从其他针对SDK 23及更高版本的应用程序中提取

PackageManager manager = getApplicationContext().getPackageManager();Resources resources = null;try {resources = manager.getResourcesForApplication("com.anyapp");}catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}assert resources != null;Drawable notiIcon = ResourcesCompat.getDrawable(resources, current.iconId/* drawable resource id */, null);

试试这个

ContextCompat.getDrawable(getActivity(), R.drawable.drawable_resource_name);