Решение задач 1 и 2 Идея:
Создать интерфейс, скажем FragmentInstanceHandler
public interface FragmentInstanceHandler {
public void openFragment(Fragment fragment, String fragmentTag);
}
Создайте BaseFragment
, как показано ниже, и распространите его на все ваши Fragment
классы:
public BaseFragment extends Fragment {
public FragmentInstanceHandler fragmentInstanceHandler;
public void setFragmentInstanceHandler(FragmentInstanceHandler fragmentInstanceHandler) {
this.fragmentInstanceHandler = fragmentInstanceHandler;
}
}
Реализуйте интерфейс FragmentInstanceHandler
к Activity
, в котором вы собираетесь открыть все фрагменты. Допустим, Activity
это MainActivity
:
public MainActivity extends Activity implements FragmentInstanceHandler {
private BaseFragment currentFragment;
@Override
public void openFragment(BaseFragment fragment, String fragmentTag) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment oldFragmentInstance = fragmentManager .findFragmentByTag(fragmentTag);
boolean fragmentPopped = fragmentManager.popBackStackImmediate (fragmentTag, 0);
if (!fragmentPopped && oldFragmentInstance == null) {
fragment.setFragmentInstanceHandler(this);
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.container, fragment, fragmentTag);
fragmentTransaction.addToBackStack(fragmentTag);
fragmentTransaction.commit();
currentFragment = fragment;
} else if(fragmentPopped ){
currentFragment = oldFragmentInstance;
}
if(mDrawerLayout!= null)
mDrawerLayout.closeDrawers();
}
}
Теперь, когда вы хотите открыть новый Fragment
даже из любого другого Fragment
, вы можете вызывать метод, как показано ниже. Рекомендуется предоставить новый тег , если вы хотите иметь новый экземпляр того же самого Fragment
fragmentInstanceHandler.openFragment(new MyFragment(), "FragmentNewInstance");
Вы можете настроить FragmentInstanceHandler
, чтобы добавить собственный метод для замены текущего Fragment
вместо добавления. Приведенное выше решение просто дает вам представление о том, как вы можете достичь своего решения, разместив и управляя всем своим кодом из одного места.