테스트를 해보면, 안드로이드의 기본 동작은 Dark Mode를 설정할 때 현재 액티비티가 다시 생성이 되고 BottomNavigationView가 마지막 프레그먼트의 상태를 기억해 복구를 해줍니다. Dark Mode 설정 후 홈 프레그먼트로 돌아간다는 거는 프레그먼트 스택을 잘못 사용하고 계실 수도 있다는 의미이니 이 부분은 확인을 해보시구요.
프레그먼트의 전환을 특이한 방법으로 하거나 한게 아니면, Fragment.OnBackStackChangedListener를 통해 프레그먼트가 바뀌는 걸 감지할 수 있고, BottomNavigationView는 menu를 설정해서 쓰므로 BottomNavigationView.getMenu()를 통해 메뉴를 가져와서 원하는 메뉴아이템을 찾을 수 있고 setChecked를 통해 현재 보이는 화면에 해당하는 메뉴로 선택이 가능합니다.
기본적인 코드를 아래처럼 될 것 같습니다.
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_activity_main);
if (currentFragment != null) {
String tag = currentFragment.getTag();
if ("Home".equals(tag)) {
binding.navView.getMenu().findItem(R.id.navigation_home).setChecked(true);
}
if ("Dashboard".equals(tag)) {
binding.navView.getMenu().findItem(R.id.navigation_dashboard).setChecked(true);
}
if ("Notification".equals(tag)) {
binding.navView.getMenu().findItem(R.id.navigation_notifications).setChecked(true);
}
}
}
});
코드는 일단 어떻게 되는지만 보여드리기 위해 정리되지 않은 상태입니다.
currentFragment.getTag는 FragmentManager를 통해 Fragment를 replace를 할 때 마지막에 전달하는 Tag값입니다.
public @NonNull FragmentTransaction replace(
@IdRes int containerViewId,
@NonNull Fragment fragment,
@Nullable String tag
)