删除并重新添加片段后,保留getChildFragmentManager导航堆栈

我有活动:

`  

在这个容器内,取决于按下哪个按钮出现FragmentA或FragmentB。 这些片段是嵌套子片段的容器 。 即每个片段包含自己的导航堆栈。

在onCreate of Activity中,我实例化了这两个片段:

fragmentA = (FragmentContainer) Fragment.instantiate(this, FragmentContainer.class.getName()); fragmentB = (FragmentContainer) Fragment.instantiate(this, FragmentContainer.class.getName());

然后,我继续互相替换一个:

final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction() .replace(R.id.container, fragment); .commitAllowingStateLoss();

到目前为止,非常好,一切正常。 但

问题:

每次我用fragmentB替换fragmentA(反之亦然) – getChildFragmentManager()会破坏它的导航堆栈,片段A / B每次都从头开始,而不是在被替换之前包含它的嵌套片段。

有任何想法吗? 它至少可行吗? 有一个辉煌的一天,康斯坦丁

这就是我解决这个问题的方法:

MainActivity.xml

    

MainActivity.java

 public class MainActivity extends FragmentActivity { final FragmentContainer [] fragmentContainers = new FragmentContainer[3]; int currentTabIndex = -1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final FragmentMetaData [] fragmentContainersMetaData = { new FragmentMetaData(FragmentA.class.getName(), null), new FragmentMetaData(FragmentB.class.getName(), null), new FragmentMetaData(FragmentC.class.getName(), null) }; for (int i = 0; i < fragmentContainers.length; i++) { fragmentContainers[i] = (FragmentContainer) Fragment.instantiate(this, FragmentContainer.class.getName()); fragmentContainers[i].addMetaData(fragmentContainersMetaData[i]); } tabPageNavigationSelection(0); } void replaceFragmentBy(final Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.container, fragment); fragmentTransaction.commitAllowingStateLoss(); } // Method to switch between tabs void tabPageNavigationSelection (final int index) { if (currentTabIndex == index) { fragmentContainers[currentTabIndex].clearStackExceptRootFragment(); } else { currentTabIndex = index; replaceFragmentBy(fragmentContainers[currentTabIndex]); } } } 

FragmentContainer.xml

  

FragmentContainer.java

 public final class FragmentContainer extends Fragment { private final List fragmentMetaDataStack = new ArrayList<>(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { initialize(inflater, container, R.layout.fragment_container); for (FragmentMetaData metaData : fragmentMetaDataStack) { showNestedFragment(Fragment.instantiate(getActivity(), metaData.className, metaData.fragmentBundle), fragmentMetaDataStack.indexOf(metaData) > 0, true); } return getFragmentView(); } @Override public void onResume() { super.onResume(); if (getChildFragmentManager().getFragments() == null){ return; } int stackDepth = getChildFragmentManager().getFragments().size(); if (stackDepth > 0 && fragmentMetaDataStack.size() < stackDepth && getChildFragmentManager().getFragments().get(fragmentMetaDataStack.size() - 1) != null) { getChildFragmentManager().getFragments().get(fragmentMetaDataStack.size()-1).onResume(); } } public void showNestedFragment(final Fragment fragment, final boolean addToBackStack, final boolean isRestoring) { final FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.nestedContainer, fragment); if (addToBackStack) { fragmentTransaction.addToBackStack(null); } if (!isRestoring) { fragmentMetaDataStack.add(new FragmentMetaData(fragment.getClass().getName(), fragment.getArguments())); } fragmentTransaction.commitAllowingStateLoss(); } public void onBackPressed() { if (getChildFragmentManager().getBackStackEntryCount() > 0) { getChildFragmentManager().popBackStack(); fragmentMetaDataStack.remove(fragmentMetaDataStack.size() - 1); } else { getActivity().finish(); } } public void addMetaData(FragmentMetaData metaData) { fragmentMetaDataStack.add(metaData); } public void clearStackExceptRootFragment() { getChildFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); while (fragmentMetaDataStack.size() > 1) { fragmentMetaDataStack.remove(1); } } } 

希望它能帮助那些试图复制instagram导航模型的人:)