动态添加fragment
动态添加碎片基本使用
private void replaceFragment(Fragment fragment){
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction transaction=fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout,fragment);
transaction.commit();
}
代码解释:
- 首先需要创建待添加的fragment实例,也就是方法中传递过来的参数。
- 获取FragmentManager,在活动中可以直接调用getSupportFragmentManager()方法得到
- 使用FragmentManager开启一个事务,使用beginTransaction()方法开启
- 向容器内容添加或替换碎片,这里使用replace()方法实现,需要传入容器的id和待添加的fragment。(注意这里的容器指的是要存放这个fragment实例的viewGroup)
- 提交事务,调用commit()方法来实现
使用事务向容器中添加实例的时候,repalce与add有什么区别?
在使用add()函数的时候,一般伴随着hide()或者show();
先说一下每个函数的概念:
- add():向活动中添加一个fragment,这个fragment在activity容器中有他自己的视图
- show():显示一个以前被隐藏的Fragment,前提是fragment已经添加到了活动中,显示fragment的view
- hide():隐藏一个已经存在的fragment,前提是fragment已经添加到了活动中,隐藏fragment的view
- replace():执行的是一个remove(Fragment)–>add()操作过程
共同点:
二者都可以解决Fragment直接切换时的闪动问题,
hide()方法仅仅是隐藏了Fragment的View,而没有销毁View,show()方法仅仅是显示之前隐藏的View。
replace是先移除再添加重新创建fragment
add是添加新的fragment
如何在Fragment中模拟返回栈,也就是从一个Fragment可以返回到另一个Fragment?
FragmentTracsaction中提供了一个addToBackStack()方法,用于将一个事务添加到返回栈中。
//上面代码commit之前添加
transaction.addToBackStack(null);
如果之前有一个fragment,这时候在按back按键,程序并不会直接退出,而是返回到上一个fragment。
Fragment中嵌套Fragment
开发过程中Fragment嵌套Fragment不显示问题(当时场景应用在嵌套的融云聊天列表Fragment):
原因是因为在获取FragmentManager实例的时候使用的getSupportFragmentManager,嵌套Fragment**一定要使用getChildFragmentManager**,谨记。
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
mConversationListFragment = initConversationList();
fragmentTransaction.add(R.id.lin_fragment_chat, mConversationListFragment, "chat");
fragmentTransaction.addToBackStack("chat");
fragmentTransaction.commitAllowingStateLoss();