Fragment 的切换方式分为

  1. add()&remove()
  2. hide()&show()
  3. detach()&attach()

也许你会问不是还有 replace()方法吗?其实 replace()其实是先调用了 remove()然后再调用 add()方法,所以不算那三种其实之一。那么这三种方式有什么区别呢?add()&remove()就是添加和移
除,因此 replace()这个方法只是在上一个 Fragment 不再需要时采用的简便方法。
而hide()&show()则是指隐藏和显示,这种方式防止 Fragment 多次创建实例对象,所以正确的切换方式是 add(),切换时 hide(),add()另一个 Fragment;再次切换时,只需 hide()当前,show()另一个,这样就能做到多个 Fragment 切换不重新实例化。那么 detach()&attach()呢?使用 detach()会将 view 从 ViewTree 中删除,和 remove()不同,此时 Fragment 的状态依然保持着,在使用 attach()时会再次调用 onCreateView()来重绘视图,注意使用 detach()后Fragment.isAdded()方法将返回 false,在使用 attach()还原 Fragment 后 isAdded()会依然返回
false(需要再次确认)执行 detach()和 replace()后要还原视图的话, 可以在相应的 Fragment 中保持相应的 view,并在 onCreateView()方法中通过 view 的 parent 的 removeView()方法将view 和 parent 的关联删除后返回,这种方式极少使用。