Здравствуйте! изучаю разработку под 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)
, а хотелось бы, что если я нахожусь в другом фрагменте и выбираю в боковом меню сменить тему, то я оставался в этом фрагменте