Android 位于NinePatchDrawable的ResourcesNotFoundException

Android 位于NinePatchDrawable的ResourcesNotFoundException,android,android-layout,exception,android-drawable,Android,Android Layout,Exception,Android Drawable,当我尝试在下线绘制九个补丁时,我遇到了ResourcesNotFoundException。我遇到这个问题的设备是LGE Nexus(安卓8)和Google Pixel(安卓10)。我尝试过的其他设备工作正常 mRecyclerViewDragDropManager.setDraggingItemShadowDrawable( (NinePatchDrawable) ContextCompat.getDrawable(this, R.drawable.materi

当我尝试在下线绘制九个补丁时,我遇到了ResourcesNotFoundException。我遇到这个问题的设备是LGE Nexus(安卓8)和Google Pixel(安卓10)。我尝试过的其他设备工作正常

mRecyclerViewDragDropManager.setDraggingItemShadowDrawable(
                (NinePatchDrawable) ContextCompat.getDrawable(this, R.drawable.material_shadow_z3));
例外情况

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo: android.content.res.Resources$NotFoundException: Resource ID #0x7f0800af
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
       at android.app.ActivityThread.-wrap11(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6541)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
Caused by android.content.res.Resources$NotFoundException: Resource ID
#0x7f0800af
       at android.content.res.ResourcesImpl.getValueForDensity(ResourcesImpl.java:204)
       at android.content.res.Resources.getDrawableForDensity(Resources.java:875)
       at android.content.res.Resources.getDrawable(Resources.java:818)
       at android.content.Context.getDrawable(Context.java:605)
       at androidx.core.content.ContextCompat.getDrawable(ContextCompat.java:463)
       at init(ImagesActivity.java:211)
       at onCreate(ImagesActivity.java:121)
       at android.app.Activity.performCreate(Activity.java:6975)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
       at android.app.ActivityThread.-wrap11(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6541)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
我提供了可绘制hdpi、可绘制mdpi、可绘制xhdpi、可绘制xxhdpi、可绘制xxhdpi等格式的材料-

material_shadow_z3.xml

<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:src="@drawable/material_shadow_z3_mdpi"
    tools:ignore="unused" />

根据评论更新-

material_shadow_z3_mdpi
位于可绘制nodpi文件夹中,是一个9块png图像。类似地,我有
material_shadow_z3_xhdpi、material_shadow_z3_xxxhdpi、material_shadow_z3_xxxhdpi
位于同一可绘制nodpi文件夹中

与此类似-

无法100%确定问题的原因,但我猜您的文件排序方式存在问题,虽然您的本地版本可以使用所有文件,但如果您使用的是应用程序捆绑包,用户安装时可能无法使用这些文件,因为他们获得了特定设备的优化apk


这是您通常放置资源的方式

选项1-单个9面片图像 如果您有一个9patch图像,可以缩放和拉伸以用于任何密度,只需将
.9.png
放在
可绘制的
文件夹中即可

选项2-不同密度的不同9面片图像 如果9patch的某些方面需要根据密度而有所不同,请在每个相关的
drawable-
文件夹中放置一个
.9.png
图像。系统将在运行时加载相关图像,如果没有提供,则从其他密度缩放最佳拟合


只有当您想手动设置抖动时,使用XML资源声明才有意义


因此,对于您的用例:删除
material\u shadow\u z3.xml
并将
material\u shadow\u z3.9.png
放置在适当的可绘制文件夹中,而不使用密度标识符。如果图像本身不是真正依赖于密度的(例如,阴影的带有边缘的灰色条),则最好只使用一个9patch png.

无法100%确定问题的原因,但我的猜测是,您对文件的排序方式存在问题,虽然您的本地版本可以使用所有文件,但如果您使用的是应用程序捆绑包,则用户的安装可能无法使用这些文件,因为他们获得了特定设备的优化apk


这是您通常放置资源的方式

选项1-单个9面片图像 如果您有一个9patch图像,可以缩放和拉伸以用于任何密度,只需将
.9.png
放在
可绘制的
文件夹中即可

选项2-不同密度的不同9面片图像 如果9patch的某些方面需要根据密度而有所不同,请在每个相关的
drawable-
文件夹中放置一个
.9.png
图像。系统将在运行时加载相关图像,如果没有提供,则从其他密度缩放最佳拟合


只有当您想手动设置抖动时,使用XML资源声明才有意义


因此,对于您的用例:删除
material\u shadow\u z3.xml
并将
material\u shadow\u z3.9.png
放置在适当的可绘制文件夹中,而不使用密度标识符。如果图像本身不依赖于密度(例如阴影边缘的灰色条),则只需使用一个9patch png就更好了。

为什么您提供了多个版本的9patch可绘制图像?你的
@drawable/material\u shadow\u z3\u mdpi
在哪里?@ymindstorm
material\u shadow\u z3\u mdpi
位于drawable nodpi文件夹中,是一个9块png图像。类似地,我有
material\u shadow\u z3\u xhdpi,material\u shadow\u z3xhdpi,material_shadow_z3_xxxhdpi
位于同一个可绘制nodpi文件夹中。与此类似,实际的九块可绘制补丁的名称是什么?它应该是“material_shadow_z3_mdpi.9.png”。它将在XML文件中被引用为
@drawable/material\u shadow\u z3\u mdpi
。如果在logcat中向下看,可能会看到“需要有效的9补丁源映像”,这表明存在此问题。只有在与nodpi资产冲突的设备上才能看到这一点。@Cheticamp'material_shadow_z3_mdpi.9.png'是名称。你能解释问题出在哪里吗?仍然是个谜。不过,我确实认为ymindstorm在做什么。您可能有太多的可抽出式电缆,这些电缆只是多余的,并且缺少一些导致问题的东西。如果相同的9-patch(material_shadow_z3_mdpi.9.png)和XML(material_shadow_z3.XML)适用于所有密度,则将这两个文件放在drawable anydpi文件夹中,并删除所有其他文件。在国际海事组织看来,这很可能解决问题。即使不能解决问题,这仍然是一条路要走。更好的是,既然XML除了保存9-patch之外似乎什么都不做,那么就放弃它,只使用9-patch吧。为什么您提供了多个版本的9-patch绘图工具?你的
@drawable/material\u shadow\u z3\u mdpi
在哪里?@ymindstorm
material\u shadow\u z3\u mdpi
位于drawable nodpi文件夹中,是一个9块png图像。类似地,我有
material\u shadow\u z3\u xhdpi,material\u shadow\u z3xhdpi,material_shadow_z3_xxxhdpi
位于同一个可绘制nodpi文件夹中。与此类似,实际的九块可绘制补丁的名称是什么?它应该是“material_shadow_z3_mdpi.9.png”。它将在XML文件中被引用为
@drawable/material\u shadow\u z3\u mdpi
。如果在logcat中向下看,可能会看到“需要有效的9补丁源映像”,这表明存在此问题。只有在与nodpi资产冲突的设备上才能看到这种情况。@Cheticamp'material\u shadow\u z3\u mdpi.9.png'是名称。您能解释一下