问题 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 而不是添加。上述解决方案只是让您了解如何通过从一个地方放置和管理所有代码来实现您的解决方案。