web-dev-qa-db-ja.com

Android --Android.content.res.Resources $ NotFoundException:リソースID#0x0

電話でファイルを参照する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;
}

}

[〜#〜] update [〜#〜]これが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();
}

}
8
user2201650

心配しないでください。 。 。

私は以前に同じ問題を抱えていました。ドローアブルを取得するために私の方法を使用してください

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

例:

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

これは間違いなくあなたの問題を愛するでしょう。

ただし、ドローアブルフォルダに画像がない場合は2つの可能性があります

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

最初のケースでは

imageCity.setImageBitmap(BitmapFactory.decodeFile(Environment.getExternalStorage‌​Directory()+"image.png"));

2番目のケースでは

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

参照: RLからのAndroid描画可能画像

問題が解決しない場合は、私に連絡してください [email protected]

4

このコードが問題を引き起こしています:

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

ここには少なくとも2つの問題があります。

  1. URIには「drawable」プレフィックスを付けないでください
  2. getIdentifierの呼び出しでは、リソースタイプとして「drawable」を渡す必要があります

したがって、次のコードを試してください。

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

[〜#〜] note [〜#〜]Itemクラス、またはgetImageの機能を投稿していません。それでも例外が発生する場合(imageResourceが0であるため)、i.getImage()が返すものとまったく同じ名前のドローアブルリソースがないため、それも確認する必要があります。

6
Greg Ennis

このエラーは、AlertDialogを使用する場合にAndroidでapplicationContextを表示するときにも表示されます。

val builder = AlertDialog.Builder(applicationContext)

解決策はthisを使用することです。

val builder = AlertDialog.Builder(this)
2
hertzon