首先要提一点,如果你要学习Fragment
那么你至少得是掌握了Activity
的,如果你还不了解Activity
,笔者建议你先去看一些Activity
相关的文章,再来进阶Fragment
.从下面的文章开始,默认读者已经了解了Activity
的生命周期等相关知识。
Fragment
拥有Activity
所有的生命周期回调函数并且由于自身特点还扩展了一些回调函数,但是这些与Activity
相关的回调函数几乎只与Fragment
依附的Activity
有关,如果不熟悉Fragment
,很容易凭直觉造成误会.例如,一个Fragment
并不会因为在Fragment
回退栈上有其他Fragment
把它盖住,又或者是你使用FragmentTransition
将它hide
而导致他onPause
,onPause
只跟此Fragment
依附的Activity
有关,这在Fragment
的源码中写得清清楚楚.
/**
- Called when the Fragment is no longer resumed. This is generally
- tied to {@link Activity#onPause() Activity.onPause} of the containing
- Activity’s lifecycle.
*/
@CallSuper
public void onPause() {
mCalled = true;
}
那当我们想在Fragment
不显示时做一些事情要怎么办呢?我们有onHiddenChanged
回调,当Fragment
的显示状态通过FragmentTransition
改变时(hide
和show
),就会回调这个函数,参数hidden
将告诉你这个Fragment
现在是被隐藏还是显示着.
/**
- Called when the hidden state (as returned by {@link #isHidden()} of
- the fragment has changed. Fragments start out not hidden; this will
- be called whenever the fragment changes state from that.
- @param hidden True if the fragment is now hidden, false otherwise.
*/
public void onHiddenChanged(boolean hidden) {
}
Fragment
有两种方式生成,一是硬编码到xml
文件中,二是在Java
代码中new
,然后通过FragmentManager#beginTransaction
开启FragmentTransaction
提交来添加Fragment
(下文会介绍).两种方式存在着一定区别.硬编码到xml
的Fragment
无法被FragmentTransition#remove
移除,与Activity
同生共死,所以你要是这么用了,就不用试了,移除不了的,但是在代码中new
出来的是可以被移除的.
硬编码到xml
中:
添加Fragment
的第二种方式就是使用Frag