Fragment 知识点

Fragment常见知识点整理。

Fragment生命周期

image

创建Fragment

创建Fragment一般有两种方式,在xml中定义和动态创建,我们通常使用动态创建的方式。并且传参是通过setArguments()来完成,这样在应用重启时可以通过savedInstanceState获取完整的参数值。

1
2
3
4
5
6
7
public static xxxFragment newInstance(String arg) {
Bundle args = new Bundle();
args.putString(ARG, arg);
xxxFragment fragment = new xxxFragment();
fragment.setArguments(args);
return fragment;
}

Fragment中获取宿主Activity

通常情况下我们会通过getActivity()来获取宿主Activity,但是某些情况下这个方法会返回null,所以兼容的方法就是在onAttach()方法中赋值然后获取。

1
2
3
4
5
@Override
public void onAttach(Context context) {
super.onAttach(context);
mAcivity = (Activity) context;
}

back stack对Fragment生命周期的影响

  • 没有加入后退栈的Fragmentremove或者被replace的时候会完整的走完生命周期直到onDetach()
  • 加入后退栈的Fragmentremove或者replace的时候只会走到onDestoryView(),当popEnter的时候会从onCreateView()走到onResume

hideshow方法的特别之处

  • hideshow方法不会触发Fragment生命周期的变化,只会触发onHiddenChanged()方法。
  • 创建Fragment不会触发onHiddenChanged()方法。
  • 只有已经存在的Fragment才能调用hideshow方法。

其他注意事项

  • Fragment只调用add没有调用remove或者replace的时候,如果这时候宿主Activity生命周期变化的话,其中所有add进来的Fragment的生命周期都会相应的变化,Activity#onStop()的时候Fragment#onStop()也会执行,其他生命周期类似。需要注意的是Fragment执行的顺序是按照add进去的顺序执行的。

add AFragment, add BFragment。后面生命周期的变化就是先执行AFragment再执行BFragment的。

  • 当使用back stack时,如果宿主Activity生命周期变化的话只会触发当前Fragment生命周期变化,栈里其他Fragment生命周期只受FragmentTransaction影响