Android getResources().getDrawable() 已弃用 API 22

Android getResources().getDrawable() deprecated API 22

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

发生了什么变化?

编辑:请参阅 my blog post 主题以获得更完整的解释


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

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 关联的可绘制对象屏幕 density/theme。调用已弃用的 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是上下文)

有关详细信息,请遵循此 link:ContextCompat

你有一些选择来正确地(和未来证明)处理这个弃用的方式,这取决于你正在加载的可绘制对象的类型:


A) 可绘制对象具有 主题属性

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

您将按照 Activity 主题的指示获得样式化的 Drawable。 这可能就是您所需要的。


B) 可绘制对象没有 主题属性

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

您将以旧方式获得无样式的可绘制对象。请注意:ResourcesCompat.getDrawable() 弃用!


EXTRA) drawables with theme attributes from another theme

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

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

getDrawable (int id, Resources.Theme 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));
}

Build.VERSION_CODES.LOLLIPOP 现在应该改为 BuildVersionCodes.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));
    }
}

和api 14级

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

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

context.getDrawable(R.drawable.your_drawable_name)

See docs

现在你需要这样实现

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

下面一行代码就够了,一切都会由ContextCompat.getDrawable

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

getDrawable(int drawable) 在 API 级别 22 中被弃用。 有关参考,请参阅此 link

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

getDrawable(int id, Resources.Theme theme)

对于解决方案这样做:-

在Java:-

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

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

在 Kotlin 中:-

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

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

希望这会有所帮助 you.Thanks。

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

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

正如所建议的那样here and here 有时这是从资源访问向量所必需的,尤其是当您处理菜单项等时

在 Kotlin 中你可以使用扩展

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);