Android Java 无法找到资源 ID

时间:2021-02-19 10:50:19

标签: java android xml layout

在某些设备上没有问题,但在某些设备上打开 ImageView 的 src 时会出现此类异常。

堆栈跟踪如下所示:

    java.lang.RuntimeException: Unable to start activity 
    ComponentInfo{pl.jawegiel.endlessblow/pl.jawegiel.endlessblow.activities.MainActivity}: 
android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class 
ImageView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666) at 
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) at android.app.ActivityThread.-
wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) at 
android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at 
android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native 
Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) Caused by: android.view.InflateException: 
Binary XML file line #11: Binary XML file line #11: Error inflating class ImageView Caused by: 
android.view.InflateException: Binary XML file line #11: Error inflating class ImageView Caused by: 
android.content.res.Resources$NotFoundException: Drawable (missing name) with resource ID #0x7f0800cd 
Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f0800cd at 
android.content.res.ResourcesImpl.getResourceName(ResourcesImpl.java:228) at 
android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:687) at 
android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571) at 
android.content.res.Resources.loadDrawable(Resources.java:858) at 
android.content.res.TypedArray.getDrawable(TypedArray.java:928) at android.widget.ImageView.
(ImageView.java:162) at android.widget.ImageView.(ImageView.java:150) at 
androidx.appcompat.widget.AppCompatImageView.(AppCompatImageView.java:74) at 
androidx.appcompat.widget.AppCompatImageView.(AppCompatImageView.java:69) at 
androidx.appcompat.app.AppCompatViewInflater.createImageView(AppCompatViewInflater.java:199) at 
androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:119) at 
androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1551) at 
androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1602) at 
android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:769) at 
android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) at 
android.view.LayoutInflater.rInflate(LayoutInflater.java:858) at 
android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) at 
android.view.LayoutInflater.inflate(LayoutInflater.java:518) at 
android.view.LayoutInflater.inflate(LayoutInflater.java:426) at 
android.view.LayoutInflater.inflate(LayoutInflater.java:377) at 
androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696) at 
androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170) at 
pl.jawegiel.endlessblow.activities.MainActivity.onCreate(MainActivity.java:50) at 
android.app.Activity.performCreate(Activity.java:6682) at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619) at 
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) at android.app.ActivityThread.-
wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) at 
android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at 
android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native 
Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

MainActivity.java:50 看起来像这样:

setContentView(R.layout.activity_main);

导致问题的ImageView如下所示:

    <ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/splash2"
    android:scaleType="fitXY"
    android:adjustViewBounds="true"
    android:contentDescription="TODO" />

这个 splash2.png 位于 res\drawable、res\drawable-hdpi、res\drawable-mdpi、res\drawable-xhdpi、res\drawable-xxhdpi 和 res\drawable-xxxhdpi 所以我猜在正确的文件夹中。那么如何解决呢?

先谢谢你!

1 个答案:

答案 0 :(得分:0)

您或许可以使用更通用的方法来解决此问题: 尝试使用可缩放矢量图形 (SVG) 而不是 .PNG 图像。如果您需要匹配不同的屏幕分辨率,VectorDrawable 更加灵活。

可以使用 Inkscape 或在线 PNG 转换器 (https://convertio.co/de/png-svg/) 将 PNG 转换为可缩放的矢量图形

之后,您可以通过加载 SVG 创建一个新的 VectorDrawable。可以使用 app:srcCompat="@drawable/ic_VectorDrawableName"

分配 VectorDrawable

文档:

<块引用>

VectorDrawable 是在 XML 文件中定义为一组的矢量图形 点、线和曲线及其相关颜色 信息。使用矢量可绘制的主要优点是图像 可扩展性。它可以在不损失显示质量的情况下进行缩放, 意味着相同的文件被调整为不同的屏幕密度而不 图像质量损失。这导致更小的 APK 文件和更少的 开发者维护。您还可以使用矢量图像制作动画 为每个显示器使用多个 XML 文件而不是多个图像 分辨率。

VectorDrawable 还需要比 .PNG 少得多的 RAM。

您可以在此线程中找到错误的原因:

Resources$NotFoundException drawable-xhdpi from drawable resource

相关问题