安卓 - android.content.res.Resources$NotFoundException: 资源ID #0x0

14

我正在尝试编写一款Android应用程序,该应用程序可以浏览手机上的文件。当我在模拟器上运行应用程序时,出现以下错误:

02-18 22:14:17.839: E/AndroidRuntime(896): FATAL EXCEPTION: main
02-18 22:14:17.839: E/AndroidRuntime(896):     android.content.res.Resources$NotFoundException: Resource ID #0x0
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.content.res.Resources.getValue(Resources.java:1018)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.content.res.Resources.getDrawable(Resources.java:663)
02-18 22:14:17.839: E/AndroidRuntime(896):  at com.example.App.FileArrayAdapter.getView(FileArrayAdapter.java:56)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.AbsListView.obtainView(AbsListView.java:2033)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.ListView.makeAndAddView(ListView.java:1772)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.ListView.fillDown(ListView.java:672)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.ListView.fillFromTop(ListView.java:732)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.ListView.layoutChildren(ListView.java:1625)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.AbsListView.onLayout(AbsListView.java:1863)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.View.layout(View.java:11278)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.ViewGroup.layout(ViewGroup.java:4224)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.View.layout(View.java:11278)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.ViewGroup.layout(ViewGroup.java:4224)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.View.layout(View.java:11278)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.ViewGroup.layout(ViewGroup.java:4224)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.View.layout(View.java:11278)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.ViewGroup.layout(ViewGroup.java:4224)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1489)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.os.Looper.loop(Looper.java:137)
02-18 22:14:17.839: E/AndroidRuntime(896):  at android.app.ActivityThread.main(ActivityThread.java:4424)
02-18 22:14:17.839: E/AndroidRuntime(896):  at java.lang.reflect.Method.invokeNative(Native Method)
02-18 22:14:17.839: E/AndroidRuntime(896):  at java.lang.reflect.Method.invoke(Method.java:511)
02-18 22:14:17.839: E/AndroidRuntime(896):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-18 22:14:17.839: E/AndroidRuntime(896):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-18 22:14:17.839: E/AndroidRuntime(896):  at dalvik.system.NativeStart.main(Native Method)

这是FileArrayAdapter.java的Java代码:

import java.util.List;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class FileArrayAdapter extends ArrayAdapter<Item>{

private Context c;
private int id;
private List<Item> items;

public FileArrayAdapter(Context context, int textViewResourceId, List<Item> objects)
{
    super(context, textViewResourceId, objects);
    c = context;
    id = textViewResourceId;
    items = objects;
}

public Item getItem(int i)
{
    return items.get(i);
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;

    if(v == null)
    {
        LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(id, null);
    }

    final Item i = items.get(position);

    if(i != null)
    {
        TextView t1 = (TextView)v.findViewById(R.id.TextView01);
        TextView t2 = (TextView)v.findViewById(R.id.TextView02);
        TextView t3 = (TextView)v.findViewById(R.id.TextViewDate);

        ImageView imageCity = (ImageView) v.findViewById(R.id.fd_Icon1);
        String uri = "drawable/" + i.getImage();

        int imageResource = c.getResources().getIdentifier(uri, null, c.getPackageName());
        Drawable image = c.getResources().getDrawable(imageResource);
        imageCity.setImageDrawable(image);

        if(t1 != null)
            t1.setText(i.getName());

        if(t2 != null)
            t2.setText(i.getData());

        if(t3 != null)
            t3.setText(i.getDate());
    }

    return v;
}

}

更新 这是Item.java的代码:

public class Item implements Comparable<Item>{

private String name, data, date, path, image;

public Item(String n, String d, String dt, String p, String i)
{
    name = n;
    data = d;
    date = dt;
    path = p;
    image = i;
}

public String getName()
{
    return name;
}

public String getData()
{
        return data;
}

public String getDate()
{
        return date;
}

public String getPath()
{
        return path;
}

public String getImage() 
{
        return image;
}

@Override
public int compareTo(Item another) {
    // TODO Auto-generated method stub
    if(this.name != null)
        return this.name.toLowerCase().compareTo(another.getName().toLowerCase());
    else
        throw new IllegalArgumentException();
}

}

1
FileArrayAdapter.java 中的第 56 行是什么? - ρяσѕρєя K
1
i.getData()i.getDate()返回什么?它们是Strings还是其他类型的数据? - codeMagic
1
你尝试过这样写吗?int imageResource = c.getResources().getIdentifier(i.getImage(), "drawable", c.getPackageName()); - ρяσѕρєя K
1
@ρяσѕρєяK 第56行是Drawable image = c.getResources().getDrawable(imageResource); - user2201650
1
@codeMagic 它们是字符串。 - user2201650
显示剩余2条评论
3个回答

6
这段代码引起了问题:
String uri = "drawable/" + i.getImage();
int imageResource = c.getResources().getIdentifier(uri, null, c.getPackageName());

这里至少有两个问题:

  1. uri不应该带有“drawable”前缀
  2. 调用getIdentifier时应该将资源类型传递为“drawable”

因此,请尝试使用以下代码:

String uri = i.getImage();
int imageResource = c.getResources().getIdentifier(uri, "drawable", c.getPackageName());

注意: 您没有发布Item类或getImage的作用。如果您仍然遇到异常(因为imageResource为0),则是因为您没有具有与i.getImage()返回的完全相同名称的可绘制资源,因此您还需要检查这一点。


我已经更新了我的问题,附上了 Item.java 代码。我尝试了你告诉我的方法,但我仍然得到相同的异常。 - user2201650
你看了我的笔记吗?getImage() 函数返回的确切内容是什么?你有一个与名称完全相同(减去扩展名)的可绘制资源吗?你需要发布更多信息或自己解决。 - Greg Ennis
我正在按照这个链接(http://custom-android-dn.blogspot.com/2013/01/create-simple-file-explore-in-android.html)进行编码。 - user2201650
好的,如果你需要更多帮助,请告诉我。 - Greg Ennis
谢谢!但我仍然得到相同的异常。你能帮我吗? - user2201650
显示剩余5条评论

5

不用担心,我以前也遇到过同样的问题。使用我的方法来获取drawable。

 Drawable image = c.getResources().getDrawable(R.drawable.name_of_image_in_drawableFolder);

例子:

Drawable image = c.getResources().getDrawable(R.drawable.ic_launcher);

这绝对可以解决你的问题。

但是,如果drawable文件夹中没有图片,可能有两种情况:

- Getting Drawable from Phone(SDCARD)
- Getting Drawable from url

在第一种情况下
imageCity.setImageBitmap(BitmapFactory.decodeFile(Environment.getExternalStorage‌​Directory()+"image.png"));

在第二种情况下
imageCity.setImageDrawable(drawableFromUrl("url")); 
    public Drawable drawableFromUrl(String url) throws IOException {
        Bitmap x;
        HttpURLConnection connection = (HttpURLConnection) new URL(url)
                .openConnection();
        connection.connect();
        InputStream input = connection.getInputStream();
        x = BitmapFactory.decodeStream(input);
        return new BitmapDrawable(x);
    }

参考:从URL获取Android Drawable图片

如果遇到任何问题,您可以联系我:megaganpreet0@gmail.com


我的Eclipse项目中没有drawable文件夹。 - user2201650
如果您正在从SDCARD(PHONE)获取图像,则使用以下代码:imageCity.setImageBitmap(BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"image.png")); - Gaganpreet Singh
另一种可能性是从URL获取它。imageCity.setImageDrawable(drawableFromUrl("url"));public Drawable drawableFromUrl(String url) throws IOException { Bitmap x;HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.connect(); InputStream input = connection.getInputStream(); x = BitmapFactory.decodeStream(input); return new BitmapDrawable(x);}参考:https://dev59.com/3nA75IYBdhLWcg3wS29A - Gaganpreet Singh
我正在关注这个链接:http://custom-android-dn.blogspot.com/2013/01/create-simple-file-explore-in-android.html 你能否更改该链接中的代码并解释如何操作?谢谢! :) - user2201650
请在文件地址处写入以下代码:Environment.getExternalStorage‌​‌​Directory()+"image.png"。 - Gaganpreet Singh
显示剩余2条评论

3
当Android使用applicationContext显示AlertDialog时,也会出现此错误。
val builder = AlertDialog.Builder(applicationContext)

解决方案是使用this
val builder = AlertDialog.Builder(this)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接