有关未找到资源的奇怪异常

kat*_*tit 9 android

偶尔在市场上我的应用程序的许多用户(相同的版本 - 相同的APK)我得到这样的错误...我想主要的是这里: Caused by: java.io.FileNotFoundException: res/drawable/ic_new.png

这个文件肯定存在,它可以在其他设备上运行.我偶尔在其他带有随机文件的设备上得到这个错误.这怎么可能?

android.view.InflateException: Binary XML file line #7: Error inflating class <unknown>
  at android.view.LayoutInflater.createView(LayoutInflater.java:518)
  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
  at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
  at android.view.LayoutInflater.rInflate(LayoutInflater.java:626)
  at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
  at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
  at com.activities.MailListActivity$MailListCursorAdapter.getView(MailListActivity.java:171)
  at android.widget.AbsListView.obtainView(AbsListView.java:1560)
  at android.widget.ListView.measureHeightOfChildren(ListView.java:1289)
  at android.widget.ListView.onMeasure(ListView.java:1200)
  at android.view.View.measure(View.java:8313)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
  at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
  at android.view.View.measure(View.java:8313)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
  at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
  at android.view.View.measure(View.java:8313)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
  at android.view.View.measure(View.java:8313)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
  at android.view.View.measure(View.java:8313)
  at android.view.ViewRoot.performTraversals(ViewRoot.java:844)
  at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:130)
  at android.app.ActivityThread.main(ActivityThread.java:3687)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:507)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
  at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
  at java.lang.reflect.Constructor.constructNative(Native Method)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
  at android.view.LayoutInflater.createView(LayoutInflater.java:505)
  ... 37 more
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_new.png from drawable resource ID #0x7f02001c
  at android.content.res.Resources.loadDrawable(Resources.java:1714)
  at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
  at android.widget.ImageView.<init>(ImageView.java:118)
  at android.widget.ImageView.<init>(ImageView.java:108)
  ... 40 more
Caused by: java.io.FileNotFoundException: res/drawable/ic_new.png
  at android.content.res.AssetManager.openNonAssetNative(Native Method)
  at android.content.res.AssetManager.openNonAsset(AssetManager.java:406)
  at android.content.res.Resources.loadDrawable(Resources.java:1706)
  ... 43 more
Run Code Online (Sandbox Code Playgroud)

Bor*_*jev 4

您没有具体提及在应用程序中组织图像的方式。然而,有特定的文件夹drawable-ldpi,'drawable-mdpi','drawable-hdpi',甚至'drawable-xhdpi'以及基本的'drawable'文件夹。

也许您对所有这些都很熟悉,但我将重复它们的使用模式,因为我有一种感觉,这可能会让您失望。ldpi、mdpi、hdpi 和 xhdpi 表示低、中、高和超高 dpi - 不同的屏幕分辨率。Android 有一种特殊的方法来确定您正在运行的设备的硬件特征,从而将其映射到最相关的:ldpi、mdpi、hdpi 或 xhdpi。

当您需要图像的地方(例如 image.png)时,它首先搜索 drawable-mdpi/image.png (如果它确定您的设备要映射到 mdpi)。如果没有找到这样的图像,它会尝试drawable/image.png,如果找到的话将重新缩放它。就是这样,如果这两个搜索失败并且您在其他一些分辨率的文件夹中提供了图像,则它将不会使用它。这意味着,如果您在 xhdpi 设备上安装应用程序,并且在此类设备上仅提供 ldpi 和 mdpi 图像,则不会找到相关图像。

所以我的建议是你只使用某些格式的一些图像。这是我在没有更多信息的情况下能做的最好的事情。希望我理解正确并且我会有所帮助。