理解Fragment的生命周期
与活动类似,Fragment也有自己的生命周期。理解Fragment的生命周期有助于在Fragment销毁时能恰当地保存其实例,然后在重新创建时能够将其恢复至之前的状态。
下面的“试一试”将研究Fragment的各种状态。
(1) 使用上一节创建的项目,向Fragment1.java文件中添加如下所示的粗体代码:
- package net.learn2develop.Fragments;
- import android.app.Activity;
- import android.app.Fragment;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.util.Log;
- public class Fragment1 extends Fragment {
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- Log.d("Fragment 1", "onAttach");
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Log.d("Fragment 1", "onCreate");
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater,
- ViewGroup container, Bundle savedInstanceState) {
- Log.d("Fragment 1", "onCreateView");
-
- // Inflate the layout for this fragment
- return Inflater.inflate(R.layout.fragment1,
- container, false);
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- Log.d("Fragment 1", "onActivityCreated");
- }
-
- @Override
- public void onStart() {
- super.onStart();
- Log.d("Fragment 1", "onStart");
- }
-
- @Override
- public void onResume() {
- super.onResume();
- Log.d("Fragment 1", "onResume");
- }
-
- @Override
- public void onPause() {
- super.onPause();
- Log.d("Fragment 1", "onPause");
- }
-
- @Override
- public void onStop() {
- super.onStop();
- Log.d("Fragment 1", "onStop");
- }
-
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- Log.d("Fragment 1", "onDestroyView");
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.d("Fragment 1", "onDestroy");
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
- Log.d("Fragment 1", "onDetach");
- }
- }
(2) 按下Ctrl+F11组合键将Android模拟器切换至landscape模式。
(3) 在Eclipse中按下F11键,在Android模拟器中调试应用。
(4) 当应用在模拟器中加载时,LogCat窗口中输出的内容如下所示(Window|Show View|LogCat):
(5) 按下模拟器上的Home按钮。LogCat窗口中输出的内容如下所示:
(6) 在模拟器上单击屏幕右上角的Apps按钮再次启动应用。这一次,LogCat窗口中输出的内容如下所示:
(7) 最后,单击模拟器上的Back按钮。现在会看到如下输出:
示例说明
与活动类似,Android中的Fragment也拥有自己的生命周期。如你所见,当创建Fragment时,它会经历如下状态:
当Fragment变为可见时,它会经历如下状态:
当Fragment进入后台模式时,它会经历如下状态:
当Fragment销毁时(当托管Fragment的活动销毁时),它会经历如下状态:
与活动类似,可以在如下状态中使用Bundle对象恢复Fragment实例:
- 04-02 06:55:38.953: DEBUG/Fragment 1(6818): onAttach
- 04-02 06:55:38.953: DEBUG/Fragment 1(6818): onCreate
- 04-02 06:55:38.963: DEBUG/Fragment 1(6818): onCreateView
- 04-02 06:55:38.983: DEBUG/Fragment 1(6818): onActivityCreated
- 04-02 06:55:38.983: DEBUG/Fragment 1(6818): onStart
- 04-02 06:55:39.003: DEBUG/Fragment 1(6818): onResume
- 04-02 04:03:45.543: DEBUG/Fragments(2606): onPause
- 04-02 04:03:47.394: DEBUG/Fragments(2606): onStop
- 04-02 04:04:32.703: DEBUG/Fragments(2606): onStart
- 04-02 04:04:32.703: DEBUG/Fragments(2606): onResume
- 04-02 07:23:07.393: DEBUG/Fragment 1(7481): onPause
- 04-02 07:23:07.393: DEBUG/Fragment 1(7481): onStop
- 04-02 07:23:07.393: DEBUG/Fragment 1(7481): onDestroyView
- 04-02 07:23:07.403: DEBUG/Fragment 1(7481): onDestroy
- 04-02 07:23:07.413: DEBUG/Fragment 1(7481): onDetach
与活动类似,Android中的Fragment也拥有自己的生命周期。如你所见,当创建Fragment时,它会经历如下状态:
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
- onPause()
- onStop()
- onPause()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()
- onCreate()
- onCreateView()
- onActivityCreated()
Fragment所经历的大多数状态都类似于活动。然而,有些新状态却是其所独有的:
- onAttached()—当Fragment关联到活动上时调用
- onCreateView()—为Fragment创建视图时调用
- onActivityCreated()—当活动的onCreate()方法返回时调用
- onDestroyView()—当Fragment的视图被删除时调用
- onDetach()—当Fragment脱离活动时调用
注
意一下活动与Fragment之间的一个主要差别。它动进入后台时,它会被放到后台栈中。这样当用户按下Back按钮时,活动就可以重新执行。但对于
Fragment来说,当进入到后台时,它们并不会被放到后台栈中。相对于将Fragment放到后台栈中来说,需要显式地在Fragment事务中调用
addToBackStack()方法,如下所示:
- if (d.getWidth() > d.getHeight())
- {
- //---landscape mode---
- Fragment1 fragment1 = new Fragment1();
- fragmentTransaction.replace(
- R.id.fragmentContainer, fragment1);
- }
- else
- {
- //---portrait mode---
- Fragment2 fragment2 = new Fragment2();
- fragmentTransaction.replace(
- R.id.fragmentContainer, fragment2);
- }
-
- //---add to the back stack---
- fragmentTransaction.addToBackStack(null);
- fragmentTransaction.commit();
上述代码确保当Fragment被添加到活动中后,用户可以单击Back按钮将其删除。