public static Fragment switchPagesByHide(Map<Integer, PairX<String, SoftReference<Fragment>>> map, FragmentManager fragmentManager, int fragment_container_id, int key) {
Fragment fragment; ArrayList<Fragment> needHideFragments = new ArrayList<>(); for (Integer currentKey : map.keySet()) { if (currentKey == key) { continue; } PairX<String, SoftReference<Fragment>> pair = map.get(currentKey); fragment = pair.second.get(); if (fragment == null) { fragment = fragmentManager.findFragmentByTag(getFragmentTagName(pair.first)); if (fragment != null && fragment.isAdded()) { needHideFragments.add(fragment); if (BuildConfig.DEBUG && AppContext.DEBUG_) { Log.w(TAG, "from tag fragment :" + fragment.getClass().getSimpleName()); } } continue; } else if (fragment.isAdded()) { needHideFragments.add(fragment); } else { fragment = fragmentManager.findFragmentByTag(getFragmentTagName(fragment.getClass())); if (fragment != null && fragment.isAdded()) { needHideFragments.add(fragment); if (BuildConfig.DEBUG && AppContext.DEBUG_) { Log.w(TAG, " and instance not add,from tag fragment :" + fragment.getClass().getSimpleName()); } } } } PairX<String, SoftReference<Fragment>> pair = map.get(key);
Fragment currentFragment = pair.second.get(); Fragment tagCurrentFragment = fragmentManager.findFragmentByTag(getFragmentTagName(currentFragment.getClass().getName())); if (currentFragment == null) { if (tagCurrentFragment != null) { currentFragment = tagCurrentFragment; } else { try { currentFragment = (Fragment) Class.forName(pair.first).newInstance(); pair.second = new SoftReference<>(currentFragment); } catch (Throwable e) { e.printStackTrace(); } } } else if (tagCurrentFragment != null && tagCurrentFragment.isAdded()) {//当前如果tag里面有还是需要隐藏它. needHideFragments.add(tagCurrentFragment); }
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); for (Fragment fragment_ : needHideFragments) { //if (!fragment_.isHidden()) { if (BuildConfig.DEBUG && AppContext.DEBUG_) { if (fragment_.isHidden()) { Log.w(TAG, "REPEAT_HIDE_" + fragment_.getClass().getSimpleName()); } else {
ArrayMap<Integer, FragmentUtil.PairX<String, SoftReference<Fragment>>> fragments = new ArrayMap<>();
fragments.put(R.id.navigation_home, pairHome); fragments.put(R.id.navigation_app, new FragmentUtil.PairX<String, SoftReference<Fragment>>(AppModuleNewStyleFragment.class.getName(), new SoftReference<>(new AppModuleNewStyleFragment()))); fragments.put(R.id.navigation_reportform, new FragmentUtil.PairX<String, SoftReference<Fragment>>(ReportFormsFragment.class.getName(), new SoftReference<>(new ReportFormsFragment()))); fragments.put(R.id.navigation_notifications, new FragmentUtil.PairX<String, SoftReference<Fragment>>(NotificationsFragment.class.getName(), new SoftReference<>(new NotificationsFragment()))); fragments.put(R.id.navigation_my, new FragmentUtil.PairX<String, SoftReference<Fragment>>(MyFragment.class.getName(), new SoftReference<>(new MyFragment())));
if (savedInstanceState != null) { int tab_id = savedInstanceState.getInt("tab_id"); for (Integer key : fragments.keySet()) { Fragment fragment = getSupportFragmentManager().getFragment(savedInstanceState, key + ""); if (fragment != null) { fragments.put(key, new FragmentUtil.PairX<String, SoftReference<Fragment>>(fragment.getClass().getName(), new SoftReference<>(fragment))); if (BuildConfig.DEBUG) { Log.w(TAG, "" + fragment.getClass().getName() + "从存储中恢复了"); } } } binding.navView.setSelectedItemId(tab_id); }
在保存状态方法中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
@Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); Log.w(TAG, "onSaveInstanceState"); for (Map.Entry<Integer, FragmentUtil.PairX<String, SoftReference<Fragment>>> entry : fragments.entrySet()) { FragmentUtil.PairX<String, SoftReference<Fragment>> pair = entry.getValue(); if (pair.second.get() != null) { Fragment fragment = pair.second.get(); if (fragment != null && fragment.isAdded()) { getSupportFragmentManager().putFragment(outState, entry.getKey() + "", fragment); } } else {