前言
对于Fragment的使用算是老生常谈了,之前很早就记录过《》。里面介绍了添加Fragment的两种方法,这次简单的总结一下。
正文
Fragment的使用主要涉及FragmentTransaction类。下面简单介绍一下
FragmentTransaction
FragmentTransaction 在进行事务处理的时候,主要是调用这四个方法:replace, add, hide, show。\
下面对比介绍:
操作 | 说明 | 备注 |
---|---|---|
replace | 先将之前存在于容器的 Fragment 全部移除(销毁),然后添加要显示的Fragment(会重新执行一遍它的生命流程) | 如果容器中已经存在和要添加的 Fragment 相同的实例(注意:相同是指同一个对象,同一个类但对象不同, 例如两次 new,则不算相同) 那么它只会将除此以外的其他 Fragment 清除,而不会再次添加相同的 Fragment 实例 |
add | 不会将之前存在于容器的Fragment 移除,而是继续往容器里添加Fragment | 1. 如果同一个对象多次添加会报错2. 由于 add 操作不会将之前的 Fragment 删除,所以会造成多个 Fragment 重叠的现象,要解决这个问题可以使用 hide 隐藏之前的 Fragment |
hide | 隐藏容器中的Fragment | |
show | 将隐藏的Fragment显示出来 | hide 和 show 是配对的,当要显示隐藏的 Fragment A 时,就 show(A);而对于其他 Fragment,则先 hide 起来,等之后要显示时再 show |
切换Fragment
实现 Fragment 的切换。有两种实现方式:
使用replace
使用add,hide,show
下面分别介绍和代码演示。
使用replace
private void setFragment(Fragment fragment) { if (null == fragment) { return; } // 如果相同就没必要更新了 if (currentFragment == fragment) { return; } currentFragment = fragment; // 每次都需要重新初始化 FragmentTransaction mFragmentTransaction = getFragmentManager() .beginTransaction(); mFragmentTransaction.replace(R.id.main_content, fragment); mFragmentTransaction.commitAllowingStateLoss(); // return; }
优点
使用简单。
缺点
影响性能。
每次切换Fragment都会重新走Fragment的生命周期。
使用add,hide,show
如果Fragment没添加过就使用add()
如果添加过久先hide()上一个Fragment,然后使用show显示需要展示的Fragment
private void setFragment(Fragment from, Fragment to) { // 判断是否相同,如果是就不需要更新 if (from == to) { return; } currentFragment = to; // 每次都需要重新初始化 FragmentTransaction mFragmentTransaction = getFragmentManager() .beginTransaction(); // 判断是否已经添加过,如果没有就先添加,在显示 if (!to.isAdded()) { mFragmentTransaction.hide(from).add(R.id.main_content, to).commit(); } else { mFragmentTransaction.hide(from).show(to).commit(); } return; }
优点
提高了性能。
如果已经添加过只需要show即可。
缺点
可能存在Fragment重叠问题。
比如切换几次Fragment后,如果屏幕旋转,Activity发生重建,几个Fragment可能重叠在一起了(hide失效了)。
暂时项目中使用第一次比较多,而且项目中比较少有屏幕旋转需求,暂时没发现Fragment重叠问题,这里不深究。
参考文章
《》
《
© 版权声明