Fragment 要点

2018-09-04  本文已影响8人  kinglong1984

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后调用 

上一篇下一篇

猜你喜欢

热点阅读