Fragment作为Android最基本,最重要的基础概念之一,也是Activity的好搭档,在开发中经常会和他打交道。今天的三问就说关于Fragment:
1)生命周期:
onAttach()
:Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArguments()获取参数。onCreate()
:Fragment被创建时调用。onCreateView()
:创建Fragment的布局。onActivityCreated()
:当Activity完成onCreate()时调用。onStart()
:当Fragment可见时调用。onResume()
:当Fragment可见且可交互时调用。onPause()
:当Fragment不可交互但可见时调用。onStop()
:当Fragment不可见时调用。onDestroyView()
:当Fragment的UI从视图结构中移除时调用。onDestroy()
:销毁Fragment时调用。onDetach()
:当Fragment和Activity解除关联时调用。每个调用方法对应的生命周期变化:
add()
: onAttach()->…->onResume()。remove()
: onPause()->…->onDetach()。replace()
: 相当于旧Fragment调用remove(),新Fragment调用add()。remove()+add()的生命周期加起来show()
: 不调用任何生命周期方法,调用该方法的前提是要显示的 Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为true。hide()
: 不调用任何生命周期方法,调用该方法的前提是要显示的Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为false。Activity有Fragment的实例,所以可以执行Fragment的方法,或者传入一个接口。同样,Fragment可以通过getActivity()
获取Activity的实例,也是可以执行方法。
1)直接获取另一个Fragmetn的实例
getActivity().getSupportFragmentManager().findFragmentByTag("mainFragment");
2)接口回调 一个Fragment里面去实现接口,另一个Fragment把接口实例传进去。
3)Eventbus等框架。
smoothScroll
。传false,就是直接跳到fragment,传true,就是平滑过去。一般主页切换页面都是用false。setOffscreenPageLimit(0)
是无效的,因为方法里面会判断是否小于1。需要重写setUserVisibleHint
方法,判断fragment是否可见。getActivity()
获取activity实例,容易造成空指针,因为如果fragment已经onDetach()了,那么就会报空指针。所以要在onAttach
方法里面,就去获取activity的上下文。FragmentStatePagerAdapter
对limit外的Fragment销毁,生命周期为onPause->onStop->onDestoryView->onDestory->onDetach, onAttach->onCreate->onCreateView->onStart->onResume。也就是说切换fragment的时候有可能会多次onCreateView
,所以需要注意处理数据。onCreateView
,所以我们可以把view保存起来,如果为空再去初始化数据。见代码: @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (null == mFragmentView) {
mFragmentView = inflater.inflate(getContentViewLayoutID(), null);
ButterKnife.bind(this, mFragmentView);
isDestory = false;
initViewsAndEvents();
}
return mFragmentView;
}
Android开发者们,快来关注公众号【码上积木】,每天三问面试题,并详细剖析,助你成为offer收割机。
积累也是一种力量。