как вернуться к фрагменту при смене темы

подскажите, пожалуйста, есть метод 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 шт):

Автор решения: Shandor Hachimann

При смене темы со светлой на темную и наоборот можно использовать это переопределение метода 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).

По аналогии можно сохранять также и другие данные.

→ Ссылка