使用新的Android API 22 getResources().getDrawable()
现已弃用。
现在最好的方法是只使用getDrawable()
。
改变了什么?
答案 0 :(得分:900)
您可以选择以正确的方式(以及面向未来的)方式处理此弃用,具体取决于您要加载的可绘制类型:
A) drawables 主题属性
ContextCompat.getDrawable(getActivity(), R.drawable.name);
您将获得活动主题指示的样式Drawable。 这可能就是你所需要的。
B) drawables 没有主题属性
ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);
你会以旧的方式得到你的风格。请注意:ResourcesCompat.getDrawable()
不已弃用!
EXTRA) drawables
ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
答案 1 :(得分:730)
您应该使用支持库中的以下代码:
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)
。
答案 2 :(得分:140)
替换此行:
getResources().getDrawable(R.drawable.your_drawable)
ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)
修改
ResourcesCompat
现在也已弃用。但你可以用这个:
ContextCompat.getDrawable(this, R.drawable.your_drawable)
(此处this
是上下文)
有关详细信息,请访问以下链接:ContextCompat
答案 3 :(得分:27)
getResources().getDrawable()
。现在我们必须添加主题: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));
}
答案 4 :(得分:2)
您可以使用
static::class
这对我有用
答案 5 :(得分:1)
仅举例说明如何修复数组中的问题以加载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)));
答案 6 :(得分:1)
试试这个:
Thread.sleep()
答案 7 :(得分:0)
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);
}
答案 8 :(得分:0)
en api level 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
答案 9 :(得分:0)
答案 10 :(得分:0)
现在您需要像这样实现
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
//
} else {
//
}
只需一行代码就足够了,ContextCompat.getDrawable会照顾一切
ContextCompat.getDrawable(this, R.drawable.your_drawable_file)
答案 11 :(得分:0)
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()));
在科特林:-
rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)
或
rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)
希望这会对您有所帮助。
答案 12 :(得分:0)
对于即使在应用了该线程的建议后(我曾经是这样的人),仍然有此问题要解决的一些人,请在您的Application类上使用onCreate()方法添加这一行
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
答案 13 :(得分:0)
在Kotlin中,您可以使用扩展程序
fun Context.getMyDrawable(id : Int) : Drawable?{
return ContextCompat.getDrawable(this, id)
}
然后使用
context.getMyDrawable(R.drawable.my_icon)
答案 14 :(得分:0)
如果您需要从其他面向 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);
答案 15 :(得分:0)
试试这个
ContextCompat.getDrawable(getActivity(), R.drawable.drawable_resource_name);