Android BottomNavigationView自定义PNG图标在JellyBean设备崩溃求助
我之前也碰到过类似的低版本兼容坑,JellyBean对Drawable资源的限制确实比高版本严格不少,结合你的问题,咱们一步步来解决:
核心原因分析
你遇到的android.view.InflateException本质是API<19的系统无法正确加载那张32x32的PNG图标。高版本Android对图片格式、状态处理的容错性较高,但JellyBean及更早版本对Drawable的要求更苛刻——比如不支持索引色PNG、对无状态的单图标加载存在隐性bug等。
具体解决方案
1. 检查并转换PNG图片格式
先确认你的PNG不是索引色模式(Indexed Color),低版本Android完全无法解析这种格式的图片。你可以用Photoshop、GIMP或在线工具打开图片,将格式转换为RGB888或ARGB8888(带透明通道选后者),重新导出后替换原文件。
2. 用状态选择器定义图标(关键步骤)
BottomNavigationView的图标需要区分选中/未选中状态,直接引用单张PNG在低版本容易触发加载异常。你可以创建一个状态选择器XML文件:
在res/drawable目录下新建ic_phone_bottom_nav.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 选中状态的图标 --> <item android:drawable="@drawable/phone_selected" android:state_checked="true" /> <!-- 默认未选中状态的图标 --> <item android:drawable="@drawable/phone_unselected" /> </selector>
然后在菜单布局里引用这个选择器:
<item android:id="@+id/navigation_home" android:icon="@drawable/ic_phone_bottom_nav" android:title="@string/title_home" />
3. 适配不同屏幕密度的图标
BottomNavigationView默认图标尺寸是24dp,你用32x32的单尺寸PNG在不同密度屏幕上可能出现拉伸或加载问题。建议生成对应密度的图标:
- mdpi: 24x24px
- hdpi: 36x36px
- xhdpi: 48x48px
- xxhdpi: 72x72px
把这些图标分别放到res/drawable-mdpi、res/drawable-hdpi等对应目录下。
4. 转为矢量Drawable(推荐)
如果不想维护多尺寸PNG,你可以用Android Studio的Vector Asset Studio把PNG转成矢量Drawable文件。矢量图在所有版本的Android上兼容性更好(API<21需要在build.gradle里开启vectorDrawables.useSupportLibrary = true配置),而且体积更小。
验证步骤
做完修改后,先清理项目(Build -> Clean Project),再重新编译运行,应该就能在JellyBean设备上正常显示BottomNavigationView了。
内容的提问来源于stack exchange,提问作者H2O

