美文网首页
Fragment 要点

Fragment 要点

作者: kinglong1984 | 来源:发表于2018-09-04 23:00 被阅读8次

    1 Fragment

    1.1 Fragment

    片段,Activity中的行为或用户界面部分。可以将多个片段组合在一个 Activity 中来构建多窗格 UI,以及在多个 Activity 中重复使用某个片段。

    依附于Activity,但有自己的生命周期。

    1.2 使用Fragment

    创建一个Fragment:
    public static class TestFragment extends Fragment {

        @Override

        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

            return inflater.inflate(R.layout.fragment_test, container, false);

        }

    }

    Activity的布局中引用:

     < fragment  android:id="@+id/frag_test"

        android:name="com.klfront.iprogram.TestFragment"

        android:layout_width="match_parent"

        android:layout_height="300dp" />

    或者在Acitivity的布局文件定义一个容器布局,然后在Activity中动态添加:

    FragmentManager fragmentManager = getFragmentManager();

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    TestFragment fragment = new TestFragment ();

    fragmentTransaction.add(R.id.fragment_container, fragment);

    fragmentTransaction.commit();

    1.3 管理Fragment

    Fragment newFragment = new ExampleFragment();

    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    transaction.replace(R.id.fragment_container, newFragment);

    transaction.addToBackStack(null);

    transaction.commit();

    当按返回键时,会将之前的fragment恢复。

    注意:需要Fragment与Activity版本对应,即FragmentV4对应FragmentActivity,版本不匹配将会导致Activity被直接关闭,而不是回到上一个Fragment。

    2 Fragment生命周期

    Activity和Fragment生命周期对照

    2.1 布局文件直接嵌入fragment的场景

    布局文件直接嵌入fragment的场景,Activity和Fragment的生命周期如下:

    MainActivity: onCreate(setContentView执行过程中以下4个方法被执行)

    TestFragment: onAttach

    TestFragment: onCreate

    TestFragment: onCreateView

    TestFragment: onViewCreated

    MainActivity: onStart(FragmentActivity的onStart中调用了FragmentController的dispatchActivityCreated和dispatchStart)

    TestFragment: onActivityCreated

    TestFragment: onStart

    MainActivity: onResume(Activity的performResume先后调用了Instrumentation.callActivityOnResume和FragmentController的dispatchResume)

    MainActivity: onResume end

    TestFragment: onResume

    MainActivity: onPause(FragmentActivity的onPause调用了FragmentController的dispatchPause)

    TestFragment: onPause

    MainActivity: onStop(FragmentActivity的onStop调用了FragmentController的dispatchStop)

    TestFragment: onStop

    MainActivity: onDestroy(FragmentActivity的onDestroy调用了FragmentController的dispatchDestroy)

    TestFragment: onDestroyView

    TestFragment: onDestroy

    TestFragment: onDetach

    2.2 Activity动态添加Fragment场景

    Activity动态添加Fragment,两者的生命周期如下:

    Fragment的onAttach到onResume都是在Activity的onResume执行之后。

    onPause一直到onDetach则与布局文件嵌入fragment的情况相同。

    MainActivity: onCreate:

    MainActivity: onStart:

    MainActivity: onResume:

    MainActivity: onResumed:

    BlogFragment: onAttach:

    BlogFragment: onCreate:

    BlogFragment: onCreateView:

    BlogFragment: onViewCreated:

        onActivityCreated

        onStart

        onResume

    MainActivity: onPause

    BlogFragment: onPause

    MainActivity: onStop

    BlogFragment: onStop

    MainActivity: onDestroy

    BlogFragment: onDestroyView:

    BlogFragment: onDestroy:

    BlogFragment: onDetach:

    2.3 返回栈中回退

    从返回栈中回退到上一个碎片,执行上一个碎片的onCreateView

    onDestroyView -> onCreateView

    3 Fragment销毁后重建的现场恢复

    3.1 Activity销毁时保留Fragment

    Fragment具有属性retainInstance,默认值为false。当设备旋转时,fragment会随托管activity一起销毁并重建。

    Fragment的onCreate中调用setRetainInstance(true)方法可保留fragment。这样在设备旋转等情况下,该Fragment可以暂时与Activity分离。如果此时Fragment持有的后台线程,需要使用Fragment的Context等信息,可能出现错误。

    Fragment中定义了isAdded接口,在执行相关操作时先用于判断Fragment是否已经绑定到某个Activity。

    3.2 Fragment销毁时保存数据

    停止状态的Fragment有可能在系统内存不足时被回收。

    可重写onSaveInstanceState(Bundle outState),将数据保存到outState中。

    在onCreate、onCreateView、onViewCreated、onActivityCreated都可以通过参数Bundle savedInstanceState拿到的outState中的key-value对数据,用于恢复现场。

    Frament 中 onSaveInstanceState(Bundle outState) 调用的时机 

    按home键最小化,在onPause后调用

    长按home键,在onPause后调用

    按下电源键,在onPause后调用

    托管该Fragment的Activity 旋转时,在onPause后调用

    托管该Fragment的Activity开启新的Activity时,在onPause后调用 

    相关文章

      网友评论

          本文标题:Fragment 要点

          本文链接:https://www.haomeiwen.com/subject/jkqowftx.html