Работа с фрагментами запускает фрагмент по умолчанию при изменении конфигурации

У меня есть действие с несколькими фрагментами, один для различных действий или представлений данных, в том числе один с 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;

            }
        }

0 ответов

Другие вопросы по тегам