2017-04-26 106 views
0

这个问题有很多答案,但从技术上讲,我的问题是不同的,我已经阅读了一些文档,并同意我们不应该在一个活动中使用多个片段,我们应该使用多个活动片段取决于项目要求或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(添加) - > FragmentB(替换) - >

QUET SION 1:为什么totalFragments显示2?而我已经将FragmentB替换为A

问题2:当我按回显示2片段的按钮时,我如何从堆栈中删除?

问题3:FragmentB是可见的,但FragmentA片段生命周期的工作太..means的onResume和的onCreate funcations呼吁太奇怪了,但真正的不知道为什么

回答

0

问题1:您尚未解除,因此任何片段的片段计数是2.当你替换一个片段时,你将它替换为片段容器,而不是实例。

问题2:一旦你添加一个片段到堆栈,这意味着你将导航回到它,一旦你点击后退按钮。尽管如此,你的片段管理器片段数仍然是2,因为没有片段被删除。如果你想删除它下面的代码将这样的伎俩:

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

问题3:一旦你与B片段取代片段A,片段A将仍然有效,并调用它的,onDestroyonDestroyView,如果你把它带回它启动它的容器的生命周期从onCreateView,这意味着运行onResume是正常的,但onCreate不是。