2016-12-08 178 views
0

我想问你一些在android中不标准的导航模式。所以,我的问题描述如下。如果您没有回答或者有些细节不明白,请不要减去。只是写评论,我纠正我的东西。我不使用ViewPager或TabHost。请参阅图像了解我的预期导航模式:android标签片段导航

Model

因此,我们有活动与3个标签。所有标签必须包含碎片堆栈。第一个标签只有一个片段,所以没有后台逻辑。但是另外两个选项卡必须有后退方式的片段逻辑。用户也可以随时切换所有标签。

要实现制表符我使用BottomBar library

我试着用Stack []数组实现我的解决方案。并手动更改片段。但我收到内存泄漏。经过许多操纵,我明白在这里找不到解决办法。所以,我想问一下,我可以如何使用Android本机实现解决方案backStack。或者任何其他解决方案..等待你的答案。谢谢。

回答

1

您可以使用下面的代码将碎片添加到背堆栈。

fragmentTransaction.add(id, fragment, Tag(I usually do fragment.getclass().getName())).addToBackStack(backstackName(I usually do fragment.getclass().getName())) 

当您添加第二个片段使用下面repleaceFragentMethod。

private void replaceFragment(android.support.v4.app.Fragment fragment) { 
    String backStateName = fragment.getClass().getName(); 
    String fragmentTag = backStateName; 

    FragmentManager manager = getSupportFragmentManager(); 
    manager.executePendingTransactions(); 
    boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0); 


    if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) { //fragment not in back stack, create it. 
     FragmentTransaction ft = manager.beginTransaction(); 
     ft.replace(R.id.frament_container, fragment, fragmentTag); 
     ft.addToBackStack(backStateName); 
     ft.commit(); 
    } 
} 

查找内存泄漏使用LeakCanary(https://github.com/square/leakcanary

+0

谢谢你的答案。金丝雀lib不工作如预期: https://github.com/square/leakcanary/issues/660 我试图像你发布,但没有manager.executePendingTransactions(); 我尝试像你说的,并在这里写结果。 –

+0

另外我发现我的问题,由Eclipse MAT,所以,系统不希望最终确定我的碎片中的某个对象。我不明白为什么。那么,我们必须只使用内部的ft.addToBackStack和片段堆栈? –

+0

如果您想再次使用该片段,最好将其添加到backstack并检索相同的片段,而不是再次添加相同的片段。 – Avinash4551