Android 为什么在滑动抽屉上显示图像会强制关闭?

Android 为什么在滑动抽屉上显示图像会强制关闭?,android,imageview,android-drawable,drawerlayout,Android,Imageview,Android Drawable,Drawerlayout,我已经生成了一个滑动抽屉,它有一个图像视图和一个文本视图。我已经从SD卡生成了我的第一个图像。我想显示Drawable文件夹中的剩余部分。我已经完成了下面的编码,但是我得到了错误日志。请一步一步地告诉我我做错了什么 Profile.class List<DrawerItem> dataList; dataList.add(new DrawerItem(c.get("username"),bmp)); //dataList.add(new DrawerItem

我已经生成了一个
滑动抽屉
,它有一个
图像视图
和一个
文本视图
。我已经从SD卡生成了我的第一个图像。我想显示
Drawable
文件夹中的剩余部分。我已经完成了下面的编码,但是我得到了错误日志。请一步一步地告诉我我做错了什么

Profile.class

    List<DrawerItem> dataList;
    dataList.add(new DrawerItem(c.get("username"),bmp));

    //dataList.add(new DrawerItem(c.get("username"),R.drawable.ic_action_good));
    dataList.add(new DrawerItem("contacts", R.drawable.ic_action_good));
    dataList.add(new DrawerItem("Tasks Sent by Me", R.drawable.ic_action_gamepad));
    dataList.add(new DrawerItem("My Tasks", R.drawable.ic_action_labels));
    dataList.add(new DrawerItem("Profile", R.drawable.ic_action_search));
    dataList.add(new DrawerItem("Settings", R.drawable.ic_action_cloud));
错误日志

 04-29 10:38:43.546: E/Trace(4628): error opening trace file: No such file or directory (2)
 04-29 10:38:47.985: E/AndroidRuntime(4628): FATAL EXCEPTION: main
 04-29 10:38:47.985: E/AndroidRuntime(4628): android.content.res.Resources$NotFoundException: Resource ID #0x0
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.content.res.Resources.getValue(Resources.java:1014)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.content.res.Resources.getDrawable(Resources.java:659)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at com.example.taskmanager.CustomDrawerAdapter.getView(CustomDrawerAdapter.java:62)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.AbsListView.obtainView(AbsListView.java:2159)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.ListView.makeAndAddView(ListView.java:1831)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.ListView.fillDown(ListView.java:674)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.ListView.fillFromTop(ListView.java:735)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.ListView.layoutChildren(ListView.java:1638)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.AbsListView.onLayout(AbsListView.java:1994)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.View.layout(View.java:14008)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:714)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.View.layout(View.java:14008)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.View.layout(View.java:14008)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at  android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
  04-29 10:38:47.985: E/AndroidRuntime(4628):   at android.view.View.layout(View.java:14008)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.View.layout(View.java:14008)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
  04-29 10:38:47.985: E/AndroidRuntime(4628):   at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
  04-29 10:38:47.985: E/AndroidRuntime(4628):   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
  04-29 10:38:47.985: E/AndroidRuntime(4628):   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.Choreographer.doFrame(Choreographer.java:532)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.os.Handler.handleCallback(Handler.java:725)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at android.os.Handler.dispatchMessage(Handler.java:92)
  04-29 10:38:47.985: E/AndroidRuntime(4628):   at android.os.Looper.loop(Looper.java:137)
   04-29 10:38:47.985: E/AndroidRuntime(4628):  at android.app.ActivityThread.main(ActivityThread.java:5041)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at java.lang.reflect.Method.invokeNative(Native Method)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at java.lang.reflect.Method.invoke(Method.java:511)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
 04-29 10:38:47.985: E/AndroidRuntime(4628):    at dalvik.system.NativeStart.main(Native Method)
 04-29 10:39:45.125: E/Trace(4681): error opening trace file: No such file or directory (2)
中班

   public class DrawerItem {

String ItemName;
int imgResID;
 Bitmap bmp;
 File f;

public DrawerItem(String itemName, int imgResID) {
    super();
    ItemName = itemName;
    this.imgResID = imgResID;
}

public DrawerItem(String itemName, Bitmap bmp) {
    // TODO Auto-generated constructor stub
    ItemName = itemName;
    File f = new File("/mnt/sdcard/test2.png");

    Bitmap bmps = BitmapFactory.decodeFile(f.getAbsolutePath());
    this.bmp = bmps;
}

/*public DrawerItem(String itemName2, File f) {
    // TODO Auto-generated constructor stub
    this.f=f;
}*/

public String getItemName() {
    return ItemName;
}
public void setItemName(String itemName) {
    ItemName = itemName;
}
public int getImgResID() {
    return imgResID;
}
public void setImgResID(int imgResID) {
    this.imgResID = imgResID;
}



 }

只是想一想,为什么不尝试使用setImageResource而不是自己尝试获取可绘制的,使用框架方法

drawerHolder.icon.setImageResource(dItem.getImgResID());

如果仍然不起作用,那么这很奇怪,总是值得清理项目,以确保资源得到重建

我认为您的问题在于:

drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(dItem.getImgResID()));
从你的日志中可以看出

dItem.getImgResID()

正在返回“0”,因此资源系统无法找到您的可绘制资源,因此您的DrawerItem类未返回正确的ID

在其他情况下,问题可能是您正在从视图中获取资源:

view.getResources()
只需使用当前上下文更改该视图:

context.getResources()//上下文指向当前上下文

另一种方法是让ImageView本身从您的资源中解析drawable:

drawerHolder.icon.setImageResource(dItem.getImgResID())


0
资源id已由其他答案解决:列表中的第一项没有资源id。请检查资源id是否为
!=0
或仅使用
setImageResource()

您仍然看不到任何内容的原因是,您在
setImageDrawable()
调用下面的两行指定了一个空图像位图:

drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(
        dItem.getImgResID()));
//drawerHolder.ItemName.
drawerHolder.ItemName.setText(dItem.getItemName());
drawerHolder.icon.setImageBitmap(dItem.bmp);

移除
drawerHolder.icon.setImageBitmap(dItem.bmp)。(您可能只希望有条件地为具有位图且没有资源id的项目保留类似内容。)

这是因为该特定资源不在
drawable
文件夹中。在
CustomDrawerDatapter
中,哪一行是62?drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(dItem.getImgResID());然后是
view.getResources().getDrawable(dItem.getImgResID())
它不返回任何资源。它没有给我强制关闭,但图像没有设置,我添加了另一个类,你能检查出了什么问题吗?它通过检查资源id是否为空来工作。谢谢你,你的回答对我总是有用的。
drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(
        dItem.getImgResID()));
//drawerHolder.ItemName.
drawerHolder.ItemName.setText(dItem.getItemName());
drawerHolder.icon.setImageBitmap(dItem.bmp);