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后调用
网友评论