使用Fragments的最佳方式

时间:2017-04-26 08:22:06

标签: android-fragments fragmentmanager

这个问题有很多答案但技术上我的问题不同,我已经阅读了一些文档并同意我们不应该只在一个活动中使用多个片段,我们应该根据项目要求使用多个片段的多个活动或UI规范, 所以我的应用程序的架构是 1. BaseActivity和所有活动都是从那里开始的 2. BaseFragment和所有碎片都是从那里延伸出来的 我的代码:

在BaseActivity中我做了以下功能

public void replaceFragment(int containerViewId, Fragment fragment, String fragmentTag, boolean addToBackStack) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(containerViewId, fragment, fragmentTag);
    if(addToBackStack)
        fragmentTransaction.addToBackStack(fragmentTag);
    if(fragmentTag.matches("") && addToBackStack)
        fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

在Framelayout中添加片段

public void addFragment(int containerViewId, Fragment fragment, String fragmentTag, boolean addToBackStack, boolean isPending) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(containerViewId, fragment, fragmentTag);
    if(addToBackStack)
        fragmentTransaction.addToBackStack(fragmentTag);
    if(fragmentTag.matches("") && addToBackStack)
        fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    if(isPending)
        fragmentManager.executePendingTransactions();
}

返回功能

public void popBackStackImmediate() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.popBackStackImmediate();
}

获取总碎片

public List<Fragment> fragmentList(){
    return getSupportFragmentManager().getFragments();
}

并且流程是 FragmentA(add) - &gt; FragmentB(替换) - &gt;

QUETSION 1:为什么totalFragments显示2?我将FragmentB替换为A

问题2:当我按下后退按钮仍然显示2个碎片以及我如何从堆叠中移除?

问题3:FragmentB是可见的,但FragmentA片段的生命周期也在工作..意思是onResume和onCreate函数调用太奇怪但是真的不知道为什么

1 个答案:

答案 0 :(得分:0)

问题1:您没有删除任何片段,因此片段计数为2.当您替换片段时,您将在片段容器中替换它,而不是它的实例。

问题2:将一个片段添加到后台堆栈后,这意味着一旦点击后退按钮,您将导航回到它。仍然,您的片段管理器片段计数仍然是2,因为没有删除任何片段。如果你想删除它,下面的代码将起到作用:

getSupportFragmentManager().beginTransaction().remove(yourFragment).commit();

问题3:将片段A替换为片段B后,片段A仍然处于活动状态,并将其称为onPauseonDestroyonDestroyView,如果您将其恢复为容器它从onCreateView开始它的生命周期,这意味着运行onResume是正常的,但onCreate不是。