夜间模式下Bottom Navigation View抛出InflateException问题
已确认问题源于夜间模式主题,正常主题下应用运行完全正常。使用Android Studio创建默认Bottom Navigation Activity,项目在模拟器上运行正常,但在小米Redmi Note 9 Pro手机上,闪屏页结束后应用崩溃;新建默认导航项目则能正常运行。
崩溃日志
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.foroshgah_slami, PID: 15695 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.foroshgah_slami/com.example.foroshgah_slami.activities.DashboardActivity}: android.view.InflateException: Binary XML file line #19 in com.example.foroshgah_slami:layout/activity_dashboard: Binary XML file line #19 in com.example.foroshgah_slami:layout/activity_dashboard: Error inflating class com.google.android.material.bottomnavigation.BottomNavigationView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3771) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3938) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2291) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8319) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038) Caused by: android.view.InflateException: Binary XML file line #19 in com.example.foroshgah_slami:layout/activity_dashboard: Binary XML file line #19 in com.example.foroshgah_slami:layout/activity_dashboard: Error inflating class com.google.android.material.bottomnavigation.BottomNavigationView Caused by: android.view.InflateException: Binary XML file line #19 in com.example.foroshgah_slami:layout/activity_dashboard: Error inflating class com.google.android.material.bottomnavigation.BottomNavigationView Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:343) at android.view.LayoutInflater.createView(LayoutInflater.java:881) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1033) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:988) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1150) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1111) at android.view.LayoutInflater.inflate(LayoutInflater.java:709) at android.view.LayoutInflater.inflate(LayoutInflater.java:547) at com.example.foroshgah_slami.databinding.ActivityDashboardBinding.inflate(ActivityDashboardBinding.java:49) at com.example.foroshgah_slami.databinding.ActivityDashboardBinding.inflate(ActivityDashboardBinding.java:43) at com.example.foroshgah_slami.activities.DashboardActivity.onCreate(DashboardActivity.kt:20) at android.app.Activity.performCreate(Activity.java:8163) at android.app.Activity.performCreate(Activity.java:8130) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1330) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3744) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3938) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2291) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8319) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038) Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0 at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:244) at android.content.res.MiuiResourcesImpl.getValue(MiuiResourcesImpl.java:96) at android.content.res.Resources.getValue(Resources.java:1457) at androidx.core.content.res.ResourcesCompat.isColorInt(ResourcesCompat.java:309) at androidx.core.content.res.ResourcesCompat.inflateColorStateList(ResourcesCompat.java:256) at androidx.core.content.res.ResourcesCompat.getColorStateList(ResourcesCompat.java:236) at androidx.core.content.ContextCompat.getColorStateList(ContextCompat.java:558) at androidx.appcompat.content.res.AppCompatResources.getColorStateList(AppCompatResources.java:48) at com.google.android.material.navigation.NavigationBarMenuView.createDefaultColorStateList(NavigationBarMenuView.java:660) at com.google.android.material.navigation.NavigationBarMenuView.<init>(NavigationBarMenuView.java:113) at com.google.android.material.bottomnavigation.BottomNavigationMenuView.<init>(BottomNavigationMenuView.java:50) at com.google.android.material.bottomnavigation.BottomNavigationView.createNavigationBarMenuView(BottomNavigationView.java:216) at com.google.android.material.navigation.NavigationBarView.<init>(NavigationBarView.java:158) at com.google.android.material.bottomnavigation.BottomNavigationView.<init>(BottomNavigationView.java:108) at com.google.android.material.bottomnavigation.BottomNavigationView.<init>(BottomNavigationView.java:103) at com.google.android.material.bottomnavigation.BottomNavigationView.<init>(BottomNavigationView.java:98) ... 28 more
DashboardActivity代码
package com.example.foroshgah_slami.activities import android.os.Bundle import com.google.android.material.bottomnavigation.BottomNavigationView import androidx.appcompat.app.AppCompatActivity import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.example.foroshgah_slami.R import com.example.foroshgah_slami.databinding.ActivityDashboardBinding class DashboardActivity : BaseActivity() { private lateinit var binding: ActivityDashboardBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityDashboardBinding.inflate(layoutInflater) setContentView(binding.root) val navView: BottomNavigationView = binding.navView val navController = findNavController(R.id.nav_host_fragment_activity_dashboard) // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. val appBarConfiguration = AppBarConfiguration( setOf( R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications ) ) setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController) } override fun onBackPressed() { doubleBackToExitPressedOnce() } }
Activity布局XML文件
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?attr/actionBarSize"> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/nav_view" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="0dp" android:layout_marginEnd="0dp" android:background="?android:attr/windowBackground" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:menu="@menu/bottom_nav_menu" /> <fragment android:id="@+id/nav_host_fragment_activity_dashboard" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:layout_constraintBottom_toTopOf="@id/nav_view" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:navGraph="@navigation/mobile_navigation" /> </androidx.constraintlayout.widget.ConstraintLayout>
闪屏页代码
package com.example.foroshgah_slami.activities import android.content.Intent import android.os.Build import android.os.Build.VERSION_CODES import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.os.Handler import android.view.WindowInsets import android.view.WindowManager import com.example.foroshgah_slami.R class splash_activity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) if (Build.VERSION.SDK_INT >= VERSION_CODES.R){ window.insetsController?.hide(WindowInsets.Type.statusBars()) } else { window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN ) } Handler().postDelayed({ startActivity(Intent(this@splash_activity, DashboardActivity::class.java)) finish() } ,2500) } }
解决方案
从崩溃日志的Resources$NotFoundException: Resource ID #0x0可以看出,夜间模式下BottomNavigationView加载时找不到对应的颜色资源,原因是夜间主题缺少必要的颜色配置。
方案1:完善夜间主题配置
检查res/values-night/styles.xml,确保主题继承自MaterialComponents系列主题,并补充必要的颜色属性:
<style name="Theme.ForoshgahSlami" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- 主色调配置 --> <item name="colorPrimary">@color/purple_200</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/black</item> <!-- 确保Surface相关颜色在夜间模式有定义 --> <item name="colorOnSurface">@color/white</item> <!-- 指定BottomNavigationView的默认样式 --> <item name="bottomNavigationStyle">@style/Widget.MaterialComponents.BottomNavigationView</item> </style>
方案2:显式设置BottomNavigationView的颜色
在布局XML中给BottomNavigationView添加itemIconTint和itemTextTint属性,指定颜色状态列表:
<com.google.android.material.bottomnavigation.BottomNavigationView ... app:itemIconTint="@color/bottom_nav_item_color" app:itemTextTint="@color/bottom_nav_item_color" />
然后分别创建正常和夜间模式的颜色状态列表:
res/color/bottom_nav_item_color.xml(正常模式):
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/purple_700" android:state_checked="true" /> <item android:color="@color/gray" android:state_checked="false" /> </selector>
res/color-night/bottom_nav_item_color.xml(夜间模式):
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/purple_200" android:state_checked="true" /> <item android:color="@color/light_gray" android:state_checked="false" /> </selector>
方案3:检查主题引用完整性
确保夜间主题中没有误删系统默认依赖的属性引用,比如?attr/colorPrimary、?attr/colorOnSurface等,这些属性是Material组件正常加载的必要条件。
内容的提问来源于stack exchange,提问作者BigBeast DGX
相关产品推荐
相关产品推荐

