package com.demo.lib.common.util; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import android.util.Log; public class FragmentSwitchHelper { private static final String TAG = "FragmentSwitchHelper"; public FragmentManager mFragmentManager; private Fragment[] mFragments; private Fragment mCurrentFragment; private int mContainerId; public Fragment getFragmentByName(String name) { if (mFragments == null || mFragments.length == 0) return null; for (Fragment m : mFragments) if (name.contains(m.getClass().getName())) { return m; } return null; } public static FragmentSwitchHelper create(int containerId, FragmentManager fragmentManager, Fragment... fragments) { return new FragmentSwitchHelper(containerId, fragmentManager, fragments); } private FragmentSwitchHelper(int containerId, FragmentManager fragmentManager, Fragment... fragments) { this.mContainerId = containerId; this.mFragments = fragments; this.mFragmentManager = fragmentManager; } public void changeFragment(Class replaceFragmentClass) { if (!mFragmentManager.isDestroyed()) { Fragment replaceFragment = mFragmentManager .findFragmentByTag(replaceFragmentClass.getName()); if (mCurrentFragment == replaceFragment && mCurrentFragment != null) { Log.d(TAG, "changeFragment noChange "); return; } FragmentTransaction fragmentTransaction = mFragmentManager .beginTransaction(); if (mCurrentFragment != null) { fragmentTransaction.detach(mCurrentFragment); Log.d(TAG, "changeFragment detach " + mCurrentFragment.getClass().getName()); } if (replaceFragment == null) { for (Fragment item : mFragments) { if (item.getClass().getName() .equals(replaceFragmentClass.getName())) { replaceFragment = item; break; } } fragmentTransaction.add(mContainerId, replaceFragment, replaceFragmentClass.getName()); mCurrentFragment = replaceFragment; Log.d(TAG, "changeFragment add " + replaceFragmentClass.getName()); } else { fragmentTransaction.attach(replaceFragment); mCurrentFragment = replaceFragment; Log.d(TAG, "changeFragment attach " + replaceFragmentClass.getName()); } fragmentTransaction.commitAllowingStateLoss(); } } }