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

时间:2015-03-13 20:05:02

标签: android android-drawable android-resources android-5.1.1-lollipop

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

改变了什么?

16 个答案:

答案 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)

编辑:请参阅主题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关联的可绘制对象。调用已弃用的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)

API级别22中已弃用

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)

如果您要定位的SDK> 21(棒棒糖或5.0)

context.getDrawable(R.drawable.your_drawable_name)

See docs

答案 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)

如建议的herehere有时需要从资源访问矢量,尤其是在处理菜单项等时

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