Здравствуйте! изучаю разработку под Android и столкнулся с проблемой при переключении темы

есть боковое меню, при нажатии "сменить тему" срабатывает вот такой код

R.id.switch_light_dark -> {
                val currentNightMode = AppCompatDelegate.getDefaultNightMode()
                val newMode = if (currentNightMode == AppCompatDelegate.MODE_NIGHT_YES) {
                    AppCompatDelegate.MODE_NIGHT_NO
                } else {
                    AppCompatDelegate.MODE_NIGHT_YES
                }
                saveThemeMode(newMode)
                AppCompatDelegate.setDefaultNightMode(newMode)
            }

private fun loadThemePreference() {
    val sharedPreferences = getSharedPreferences("theme_prefs", MODE_PRIVATE)
    val theme = sharedPreferences.getInt("theme_mode", AppCompatDelegate.MODE_NIGHT_NO)

    AppCompatDelegate.setDefaultNightMode(theme)
}

метод loadThemePreference() вызывается в методе onCreate

override fun onCreate(savedInstanceState: Bundle?) {
    Log.i("theme", "1")
    App.getApp(applicationContext).componentsHolder
        .getComponent(javaClass, MainModule(applicationContext))
        .inject(this)
    Log.i("theme", "2")

    Log.i("theme", "3")

    loadThemePreference()

    super.onCreate(savedInstanceState)

    Log.i("theme", "4")

    try {
        binding = getDataBindingView(R.layout.activity_main)
    } catch (e: Exception) {
        Log.e("theme", "${e.message}")
        Log.e("theme", "1) $e")
    }

    Log.i("theme", "5")

    try {
        navController = Navigation.findNavController(this, R.id.nav_host_fragment)
    } catch (e: Exception) {
        Log.e("theme", "2) $e")
    }

    Log.i("theme", "6")

    try {
        headerBinding = DataBindingUtil.bind(binding.navigationView.getHeaderView(0))!!
    } catch (e: Exception) {
        Log.e("theme", "3) $e")
    }

    Log.e("theme", "7")

    headerBinding.handler = this
    flashlightManager = FlashlightManager(this)
    brightnessRegulator = BrightnessRegulator(this)

    observeConnectionChanges()
}

при запуске приложения в logcat выводятся значения с 1-7, но после того как нажимаю в боковой панели "сменить тему", приложение закрывается и в logcat выводится:

theme I  1
theme I  2
theme I  3
theme I  4
theme e  E  Binary XML file line #19 in com.test.app:layout/activity_main: Binary XML file line #19 in com.test.app:layout/activity_main: Error inflating class fragment
theme e  1) android.view.InflateException: Binary XML file line #19 in com.test.app:layout/activity_main: Binary XML file line #19 in com.test.app:layout/activity_main: Error inflating class fragment
theme I  5
theme e  2) java.lang.IllegalArgumentException: ID does not reference a View inside this Activity
theme I  6
theme e  3) kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized
theme I  7

помогите пожалуйста

код activity_main.xml где показано что ошибка может быть в 19 строке

<fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true" /> //19 стр

исправленный код

override fun onCreate(savedInstanceState: Bundle?) {
    App.getApp(applicationContext).componentsHolder.getComponent(
        javaClass, MainModule(applicationContext)
    ).inject(this)

    super.onCreate(savedInstanceState)

    loadThemePreference()

    binding = getDataBindingView(R.layout.activity_main)

    navController = Navigation.findNavController(this, R.id.nav_host_fragment)

    headerBinding = DataBindingUtil.bind(binding.navigationView.getHeaderView(0))!!

    headerBinding.handler = this
    flashlightManager = FlashlightManager(this)
    brightnessRegulator = BrightnessRegulator(this)

    observeConnectionChanges()
}

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    binding.drawerLayout.addDrawerListener {
        when (item.itemId) {
            R.id.notificationsViewPagerFragment -> navController.navigate(R.id.action_global_notificationsViewPagerFragment)
            R.id.tasksViewPagerFragment -> navController.navigate(R.id.action_global_tasksViewPagerFragment)
            R.id.rootEquipmentFragment -> navController.navigate(R.id.action_global_rootEquipmentFragment)
            R.id.defectsFragment -> navController.navigate(R.id.action_global_defectsFragment)
            R.id.drawer_item_get_data -> presenter.syncDataWithServer(LOAD_DATA_FROM_SERVER)
            R.id.drawer_item_send_data -> {
                presenter.syncDataWithServer(UPLOAD_DATA_TO_SERVER)

                this.lifecycleScope.launch(Dispatchers.IO) {
                    delay(300)
                    val cacheDir = [email protected]
                    cacheDir.deleteRecursively()
                    val codeCacheDir = [email protected]
                    codeCacheDir.deleteRecursively()
                    val cacheDir2 = [email protected]
                    cacheDir2?.deleteRecursively()
                }
            }

            R.id.switch_light_dark -> {
                val currentNightMode = AppCompatDelegate.getDefaultNightMode()
                val newMode = when (currentNightMode) {
                    AppCompatDelegate.MODE_NIGHT_YES -> AppCompatDelegate.MODE_NIGHT_NO
                    AppCompatDelegate.MODE_NIGHT_NO -> AppCompatDelegate.MODE_NIGHT_YES
                    else -> AppCompatDelegate.MODE_NIGHT_NO
                }
                saveThemeMode(newMode)
                updateTheme(newMode)
            }

            R.id.drawer_item_exit -> presenter.logout()
        }
        binding.drawerLayout.removeDrawerListener(it)
    }
    closeDrawer()
    return true
}

private fun updateTheme(mode: Int) {
    AppCompatDelegate.setDefaultNightMode(mode)
    val decorView = window.decorView
    decorView.invalidate()
}

override fun recreate() {
    startActivity(getIntent());
    finish();
    overridePendingTransition(0, 0);

}

private fun loadThemePreference() {
    val sharedPreferences = getSharedPreferences(Constants.APP_PREFERENCES, MODE_PRIVATE)
    val themeMode =
        sharedPreferences.getInt(Constants.THEME_MODE, AppCompatDelegate.MODE_NIGHT_NO)
    AppCompatDelegate.setDefaultNightMode(themeMode)
}

private fun saveThemeMode(mode: Int) {
    val sharedPreferences = getSharedPreferences(Constants.APP_PREFERENCES, MODE_PRIVATE)
    val editor = sharedPreferences.edit()
    editor.putInt(Constants.THEME_MODE, mode)
    editor.apply()
}

когда переопределил метод recreate() и дописал некоторый код приложение перестало вылетать, но теперь когда я нажимаю в меню сменить тему выполняется данный код:

R.id.switch_light_dark -> {
                val currentNightMode = AppCompatDelegate.getDefaultNightMode()
                val newMode = when (currentNightMode) {
                    AppCompatDelegate.MODE_NIGHT_YES -> AppCompatDelegate.MODE_NIGHT_NO
                    AppCompatDelegate.MODE_NIGHT_NO -> AppCompatDelegate.MODE_NIGHT_YES
                    else -> AppCompatDelegate.MODE_NIGHT_NO
                }
                saveThemeMode(newMode)
                updateTheme(newMode)
            }

приложение запускает фрагмент R.id.notificationsViewPagerFragment -> navController.navigate(R.id.action_global_notificationsViewPagerFragment), а хотелось бы, что если я нахожусь в другом фрагменте и выбираю в боковом меню сменить тему, то я оставался в этом фрагменте


Ответы (0 шт):