在空对象引用上调用android.graphics.drawable.Drawable.isProjected()

7
我有一个应用程序,它加载用户安装的应用程序,并在recyclerview中显示列表(应用程序名称和图标)。 这个异常在Android 8+设备上抛出,而且并不是所有设备型号都会出现(主要是三星和华为设备)。
View.java line 19595
android.view.View.getDrawableRenderNode

Fatal Exception: java.lang.NullPointerException
Attempt to invoke virtual method 'boolean android.graphics.drawable.Drawable.isProjected()' on a null object reference
android.graphics.drawable.AdaptiveIconDrawable.isProjected + 551 (AdaptiveIconDrawable.java:551)
android.view.View.getDrawableRenderNode + 19595 (View.java:19595)
android.view.View.drawBackground + 19524 (View.java:19524)
com.android.internal.os.ZygoteInit.main + 857 (ZygoteInit.java:857)

这是来自Fabric的异常日志。 非常感谢您的帮助。

你是如何获取图像并将其设置到视图中的? - Antonio
@Antonio imageView.setImageDrawable(applicationInfo.loadIcon(context.getPackageManager())); - Reza
这与 https://stackoverflow.com/questions/52132029/exception-at-android-graphics-drawable-adaptiveicondrawable-isprojected-in-andr?noredirect=1&lq=1 相关。根据 OP 在评论中发布的链接 https://dev59.com/7VcP5IYBdhLWcg3wa5M3,他找到的解决方案是将 AdaptiveIconDrawable 转换为 Bitmap,然后您可以使用它来创建 BitmapDrawable,如果您希望拥有 Drawable 对象。 - chjarder
2个回答

4

我遇到了同样的错误,发现删除 <item android:drawable="?attr/selectableItemBackground" /> 就可以解决问题。


0

我在Android 8手机上使用SplashScreen API时遇到了相同的自适应图标问题。原因是我只在drawable中定义了<foreground>而没有定义<background>。因此,你需要同时定义两者,例如:

<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <foreground android:drawable="@drawable/ic_splashscreen_fg"/>
    <background android:drawable="@drawable/ic_splashscreen_bg"/>
</adaptive-icon>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接