栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

所以这就是我解决的方法:

MainActivity.xml

<RelativeLayout>    <frameLayout        android:id="@+id/container"        android:layout_width="match_parent"        android:layout_height="match_parent"/></RelativeLayout>

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

<frameLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:background="@color/lightest_gray"    android:id="@+id/nestedContainer"    android:layout_width="match_parent"    android:layout_height="match_parent"/>

FragmentContainer.java

public final class FragmentContainer extends Fragment {    private final List<FragmentmetaData> 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导航模型的人有所帮助:)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451498.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号