Работа с фрагментами запускает фрагмент по умолчанию при изменении конфигурации
У меня есть действие с несколькими фрагментами, один для различных действий или представлений данных, в том числе один с MapFragment
где местоположение пользователя отслеживается. Навигация через BottomNavigationView
,
Я обнаружил, что всякий раз, когда я переориентирую экран, действие перезапускает фрагмент по умолчанию, независимо от того, установлен ли я
setRetainInstance(true);
Самое смешное, что реализация работает в другом моем приложении, где я использую BottomAppBar
, Я угадываю BottomNavigationView
что-то меняет, но я не могу точно сказать, что это такое.
Код загрузки фрагмента в упражнении выглядит следующим образом:
OnCreate
FragmentManager manager = getSupportFragmentManager();
if (manager.findFragmentById(R.id.frameLayout) == null) {
Log.d(TAG, "onCreate: transaction manager state is Empty: "+ manager.beginTransaction().isEmpty());
// instantiate fragment and add to view
Fragment mFragment = new ReviveFragmentIncidentDashboard();
manager.beginTransaction().replace(R.id.frameLayout, mFragment ).commit();
} else {
// Do nothing
}
OnNavigationItemSelectedListener
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener () {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId ()) {
case R.id.navigation_dashboard:
//mTextMessage.setText (R.string.title_home);
switchToFragment1();
return true;
case R.id.navigation_home:
//mTextMessage.setText (R.string.title_visits);
switchToFragment2();
return true;
case R.id.navigation_settings:
switchToFragment3();
return true;
// default: // not sure if this needs to be there
//switchToFragment1();
}
return false;
}
};
EDIT / UPDATE:
Я также пытался вручную проверить уничтожаемый фрагмент, используя onSaveInstanceState фрагмента, но по какой-то странной причине onSaveInstanceState не вызывается / outBundle не обновляется с TAG фрагмента.
Код фрагмента
private static String TAG = "FragmentHousecallDashboard";
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("fragtag", TAG);
}
Код активности:в OnCreate
FragmentManager manager = getSupportFragmentManager();
Fragment mFragment;
if(savedInstanceState == null) {
mFragment = new FragmentIncidentDashboard();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
} else {
Log.d(TAG, "onCreate: savedInstanceState : " + savedInstanceState.toString());
String fragtag = savedInstanceState.getString("fragtag");
switch(fragtag){
case "FragmentHousecallDashboard":
mFragment = new FragmentHousecallDashboard();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentHousecallRequestList":
mFragment = new FragmentHousecallRequestList();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentIncidentDashboard":
mFragment = new FragmentIncidentDashboard();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentIncidentList":
mFragment = new FragmentIncidentList();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentSettings":
mFragment = new FragmentSettings();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentSettingsAbout":
mFragment = new FragmentSettingsAbout();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentSettingsAuthentication":
mFragment = new FragmentSettingsAuthentication();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentSettingsBehavior":
mFragment = new FragmentSettingsBehavior();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentSettingsPayment":
mFragment = new FragmentSettingsPayment();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
case "FragmentSettingsPersonal":
mFragment = new FragmentSettingsPersonal();
manager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();
break;
}
}