java.lang.NoSuchMethodError:package.call.getDrawable

java.lang.NoSuchMethodError:package.call.getDrawable,java,android,image-loading,Java,Android,Image Loading,我正在创建一个小的android应用程序,它有一个酒店和餐馆的列表,并在点击时显示它们的详细信息。在编译期间,我没有错误,但在运行时,当它尝试加载映像时,我出现了错误“java.lang.NoSuchMethodError:package.class.getDrawable”。之前它显示了错误“调用需要API级别21(当前最小值为11)”,在我将最小API级别更改为16后,它作为错误从编译时消失,但仍保留在运行时。我尝试将min API更改为21,现在可以工作了,但通过这种方式,我减少了很多兼容

我正在创建一个小的android应用程序,它有一个酒店和餐馆的列表,并在点击时显示它们的详细信息。在编译期间,我没有错误,但在运行时,当它尝试加载映像时,我出现了错误“
java.lang.NoSuchMethodError:package.class.getDrawable
”。之前它显示了错误“调用需要API级别21(当前最小值为11)”,在我将最小API级别更改为16后,它作为错误从编译时消失,但仍保留在运行时。我尝试将min API更改为21,现在可以工作了,但通过这种方式,我减少了很多兼容设备的范围。最小API必须至少为16。我也尝试过@suppressint(“NewApi”),但还是出现了错误

详细信息存储在一个.xml文件中,以便我以后可以对其进行编辑。对于xml中的图像值,我存储了本地资源的路径:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <hotel>
        <KEY_KEY_TITLE>Name of hotel</KEY_KEY_TITLE>
        <KEY_IMGLARGE>@drawable/hotel_image</KEY_IMGLARGE>
        <KEY_ADDR>street somewhere</KEY_ADDR>
        <KEY_TEL>0011223344</KEY_TEL>
        <KEY_EMAIL>email@email.com</KEY_EMAIL>
        <KEY_DESC>@string/hotel_desc</KEY_DESC>
        <KEY_CITY>CITY</KEY_CITY>
    </hotel>
</resources>

酒店名称
@可绘制/酒店图片
某处街道
0011223344
email@email.com
@斯特林酒店
城市
这是我尝试检索图像的代码:

public View getView(int position, View convertView, ViewGroup parent) {

        View rowItem=convertView;
        if(rowItem==null){
            rowItem=getLayoutInflater().inflate(R.layout.row_layout, parent, false);
        }
        Hotel theHotel=hotels.get(position);//assign the object from the list
        ImageView img=(ImageView) rowItem.findViewById(R.id.item_Image);
        int drawableId;
        try{
            Class<drawable> res = R.drawable.class;
            Field field = res.getField(theHotel.getImage().substring(10, theHotel.getImage().length()));

            drawableId = field.getInt(null);
            img.setImageDrawable(getDrawable(drawableId));//error happens here in runtime
        }catch (Exception e) {
            Log.d("MyTag", "Failure to get drawable id.", e);
        }
        TextView title=(TextView) rowItem.findViewById(R.id.item_Title);
        title.setText(theHotel.getTheTitle()+" - "+theHotel.getCity());//set the title of the hotel and city

        return rowItem;
    }
public View getView(int位置、视图转换视图、视图组父视图){
视图行项目=转换视图;
if(rowItem==null){
rowItem=GetLayoutFlater()。充气(R.layout.row_布局,父级,false);
}
Hotel theHotel=hotels.get(position);//从列表中分配对象
ImageView img=(ImageView)rowItem.findViewById(R.id.item\u Image);
int-drawableId;
试一试{
等级res=R.drawable.Class;
Field=res.getField(theHotel.getImage().substring(10,theHotel.getImage().length());
drawableId=field.getInt(null);
setImageDrawable(getDrawable(drawableId));//在运行时这里发生错误
}捕获(例外e){
Log.d(“MyTag”,“无法获取可提取id”,e);
}
TextView title=(TextView)rowItem.findViewById(R.id.item\u title);
title.setText(theHotel.getTheTitle()+“-”+theHotel.getCity());//设置酒店和城市的标题
返回行项目;
}
这个问题有解决办法吗?我是android新手,在这种情况下,我想解决的最小问题是动态加载图像。如果有更好的方法,请告诉我(有任何代码示例更好:)


注意。

从getint中删除null

drawableId = field.getInt();
img.setImageDrawable(getDrawable(drawableId));
我找到了一个解决办法:

在try catch中,我编辑了以下行:

try{
                //Class<drawable> res = R.drawable.class;
                //Field field = res.getField(theHotel.getImage().substring(10, theHotel.getImage().length()));              
                //drawableId = field.getInt(null);

                drawableId=getResources().getIdentifier(theHotel.getImage().substring(1, theHotel.getImage().length()), null, getPackageName());
                Drawable theImage=getResources().getDrawable(drawableId);
                img.setImageDrawable(theImage);
            }
试试看{
//等级res=R.drawable.Class;
//Field=res.getField(theHotel.getImage().substring(10,theHotel.getImage().length());
//drawableId=field.getInt(null);
drawableId=getResources().getIdentifier(theHotel.getImage().substring(1,theHotel.getImage().length()),null,getPackageName());
Drawable theImage=getResources().getDrawable(drawableId);
img.setImageDrawable(图像);
}

这解决了问题,但我担心性能问题。如果您有更好的解决方案,请将其插入评论中,我会选择更好的解决方案。

对我来说,这样称呼很有效:

image.setImageDrawable(getResources().getDrawable(R.drawable.your_drawable_here));

我现在把API级别改回了16。如果我删除null,它会显示一个需要参数的错误,如果我添加(null),现在它会显示一个需要API级别21的编译错误。我仔细查看了这些方法,没有发现任何其他方法可以返回可绘制的。