欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment生命周期和Activity通讯方法

程序员文章站 2022-05-14 08:05:51
...

Fragment生命周期

1. Fragment为什么被成为第五大组件

  • android3.0引入,为了兼容大屏幕。
  • Fragment有自己的生命周期
  • 可以动态加载到acitivty中

两种加载方式

1)静态加载,通过布局文件
2)动态加载,通过FragmentManager

FragmentPagerAdapter和FragmentStatePagerAdaper区别

FragmentPagerAdaper中切换Fragment时,不可见的Fragment只是与activity分离了,并不会被回收,适用于页面少:

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
            + " v=" + ((Fragment)object).getView());
    mCurTransaction.detach((Fragment)object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    ...
    Fragment fragment = mFragmentManager.findFragmentByTag(name);
    if (fragment != null) {
        if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
        mCurTransaction.attach(fragment);
    }
    ...

    return fragment;
}

FragmentStatePagerAdapter适用于页面多:

This version of the pager is more useful when there are a large number of pages, working more like a list view. When pages are not visible to the user, their entire fragment may be destroyed, only keeping the saved state of that fragment.

Fragment生命周期

Fragment生命周期和Activity通讯方法

  1. onAttach(),表示fragment已经附加在activity上了,自此可以通过getActivity获得活动的引用
  2. onCreate(),表示创建这个Fragment,此时可以通过getArguments获得参数
  3. onCreateView(),该方法需要返回fragment的根视图
  4. onViewCreate(),表示视图已经创建完成,可以对控件进行初始化
  5. onActivityCreated,表示活动已经创建完成,这是在用户看到用户界面之前你可对用户界面执行的最后调整的地方
  6. onStart(),表示已经可见
  7. onResume(),表示可以进行交互

记忆:附加->创建->创建视图->视图创建完毕->活动创建完毕->开始->可见

Fragment和Activity之间的方法调用

推荐的Fragment调用Activity中的方法:由Fragment定义,Activity实现这个接口,这种写法成为接口回调


  private OnFragmentInteractionListener mListener;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        }
        else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(String data);