前言

对于Fragment的使用算是老生常谈了,之前很早就记录过《Fragment生命周期的详情》。里面介绍了添加Fragment的两种方法,这次简单的总结一下。

正文

Fragment的使用主要涉及FragmentTransaction类。下面简单介绍一下

FragmentTransaction

FragmentTransaction 在进行事务处理的时候,主要是调用这四个方法:replace, add, hide, show。\

下面对比介绍:

操作说明备注
replace先将之前存在于容器的 Fragment 全部移除(销毁),然后添加要显示的Fragment(会重新执行一遍它的生命流程)如果容器中已经存在和要添加的 Fragment 相同的实例(注意:相同是指同一个对象,同一个类但对象不同, 例如两次 new,则不算相同) 那么它只会将除此以外的其他 Fragment 清除,而不会再次添加相同的 Fragment 实例
add不会将之前存在于容器的Fragment 移除,而是继续往容器里添加Fragment1. 如果同一个对象多次添加会报错2. 由于 add 操作不会将之前的 Fragment 删除,所以会造成多个 Fragment 重叠的现象,要解决这个问题可以使用 hide 隐藏之前的 Fragment
hide隐藏容器中的Fragment
show将隐藏的Fragment显示出来hide 和 show 是配对的,当要显示隐藏的 Fragment A 时,就 show(A);而对于其他 Fragment,则先 hide 起来,等之后要显示时再 show

切换Fragment

实现 Fragment 的切换。有两种实现方式:

  1. 使用replace

  2. 使用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
  1. 如果Fragment没添加过就使用add()

  2. 如果添加过久先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重叠问题,这里不深究。

参考文章

  1. FragmentTransaction 的 replace, add, hide, show 的使用和区别

  2. Fragment生命周期的详情

相关文章

暂无评论

none
暂无评论...