как вернуться к фрагменту при смене темы
подскажите, пожалуйста, есть метод onNavigationItemSelected(item: MenuItem)
, через меню я меняю тему, и меня перенаправляет на начальный фрагмент, который появляется при запуске приложения, и если я переключусь на другой фрагмент и изменю тему оттуда через меню, то приложение запустит исходный фрагмент, но как сделать, чтобы приложениене выбросило на исходный фрагмент, я использовал getSharedPreferences, но, как я понял, при перезагрузке activity, значение было стерто и оно снова стало исходным (я попытался сохранить идентификатор фрагмента и использовать его для загрузки нужного фрагмента из onCreate()
), я совершенно новичок в android, но мне действительно нужно реализовать то, что я пытался вам объяснить)
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 saveNavigationId(id: Int) {
val sharedPreferences = getSharedPreferences(Constants.APP_PREFERENCES, MODE_PRIVATE)
val editor = sharedPreferences.edit()
editor.putInt("nav", id)
editor.apply()
}
private fun getNavigationId(): Int {
val sharedPreferences = getSharedPreferences(Constants.APP_PREFERENCES, MODE_PRIVATE)
return sharedPreferences.getInt("nav", 0)
}
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()
}
Ответы (1 шт):
При смене темы со светлой на темную и наоборот можно использовать это переопределение метода AppCompatActivity
:
@Override
protected void onNightModeChanged(int mode) {
super.onNightModeChanged(mode);
}
Это позволит узнать, изменилась ли тема ДО того, как активность будет перезагружена и снова вызовется onCreate()
. То есть при смене темы сначала вызывается onNightModeChanged()
, а потом onCreate()
Чтобы сохранить значение выбранного фрагмента можно сохранять/получать его идентификатор при помощи SharedPreferences
, но лучше использовать ViewModel
.
Для этого следует создать класс, например:
public class MainViewModel extends ViewModel {
private final MutableLiveData<Integer> fragmentId = new MutableLiveData<>();
public Integer getFragmentId() {
return fragmentId.getValue();
}
public void setFragmentId(Integer id) {
fragmentId.setValue(id);
}
}
Суть ViewModel заключается в том, что оно позволяет сохранять значения даже после изменения конфигурации приложения (темы, языка, ориентации экрана).
В активности:
private MainViewModel mainViewModel;
В onCreate()
:
mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
В тот момент, когда нужно получить информацию, нужно вызывать mainViewModel.getFragmentId()
, когда нужно записать - mainViewModel.setFragmentId(fragmentId)
.
По аналогии можно сохранять также и другие данные.