在3.0后的版本,android推出了fragment,极大的增强了布局的灵活性。有时候可能项目需求需要在一个FrameLayout中嵌套另一个FrameLayout。
先来分析红色Fragment中嵌套绿色Fragment,android中在继承fragment的类中多了几个方法,其中一个是getChildFragmentManager() 当然也有getParentFragment()得到父fragment的引用。
红色框依托于activity
FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.replace(R.id.fragment_main, mainFragment); transaction.commit();绿色框依托于父fragment
FragmentTransaction transaction = getChildFragmentManager() .beginTransaction(); transaction.replace(R.id.content, mMyFragment); transaction.commit();
再看上面图上的这个需求,一开始我想着是直接按照一般的replace方式,但是报了一个错误
06-09 19:07:26.420: E/FragmentManager(27274): No view found for id 0x7f0a0002 (com.sheepm.copyxiami:id/fragment_main)
在网上找了类似的错误,发现是因为点击的fragment中并没有id为fragment_main的,因为在红色框里面,而点击事件在绿色框里,
然后尝试了使用getParentFragment()依然失败了,后来发现在activity中替换是可以的,于是改了一下就可以了
FragmentTransaction transaction = getActivity().getFragmentManager() .beginTransaction(); transaction.replace(R.id.fragment_main, fragment); transaction.addToBackStack(null); transaction.commit();