探究Android Fragment生命周期,我们先从一个demo入手,首先定义两个Fragment,LeftFragment和RightFragment,我们在生命周期的各方法中加入相应的日志,RightFragment类似。
public class LeftFragment extends Fragment {
public static final String TAG = "LeftFragment ";
public LeftFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.e("weilei", TAG + "onAttach");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("weilei", TAG + "onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.e("weilei", TAG + "onCreateView");
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_left, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.e("weilei", TAG + "onActivityCreated");
}
@Override
public void onStart() {
super.onStart();
Log.e("weilei", TAG + "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.e("weilei", TAG + "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.e("weilei", TAG + "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.e("weilei", TAG + "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.e("weilei", TAG + "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("weilei", TAG + "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.e("weilei", TAG + "onDetach");
}
}
然后在Activity中添加这个Fragment。
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button_add).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.frame, new LeftFragment());
ft.addToBackStack(null);
ft.commit();
}
});
findViewById(R.id.button_repalce).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.frame, new RightFragment());
ft.addToBackStack(null);
ft.commit();
}
});
}
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<Button
android:id="@+id/button_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add"
android:textSize="20sp"
/>
<Button
android:id="@+id/button_repalce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Replace"
android:textSize="20sp"
/>
</LinearLayout>
<FrameLayout
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
>
</FrameLayout>
</LinearLayout>
1、运行一下,点击左侧的Add按钮,结果如下:
08-02 10:32:37.731 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onAttach
08-02 10:32:37.731 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onCreate
08-02 10:32:37.731 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onCreateView
08-02 10:32:37.732 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onActivityCreated
08-02 10:32:37.732 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onStart
08-02 10:32:37.732 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onResume
点击back:
08-02 10:33:13.541 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onPause
08-02 10:33:13.566 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onStop
08-02 10:33:13.566 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onDestroyView
08-02 10:33:13.566 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onDestroy
08-02 10:33:13.566 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment onDetach
可以看到Fragment的生命周期的过程。
08-02 11:39:39.889 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onAttach
08-02 11:39:39.889 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onCreate
08-02 11:39:39.890 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onCreateView
08-02 11:39:39.891 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onActivityCreated
08-02 11:39:39.891 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onStart
08-02 11:39:39.891 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onResume
再点击一下Replace按钮:
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onPause
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onStop
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onDestroyView
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onAttach
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onCreate
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onCreateView
08-02 11:40:25.223 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onActivityCreated
08-02 11:40:25.223 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onStart
08-02 11:40:25.223 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onResume
点击back:
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onPause
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onStop
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onDestroyView
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onDestroy
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onDetach
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onCreateView
08-02 11:41:23.107 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onActivityCreated
08-02 11:41:23.108 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onStart
08-02 11:41:23.108 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onResume
再点击back:
08-02 11:42:33.624 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onPause
08-02 11:42:33.624 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onStop
08-02 11:42:33.624 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onDestroyView
08-02 11:42:33.626 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onDestroy
08-02 11:42:33.626 22195-22195/com.weilei.fragdemo E/weilei: RightFragment onDetach
通过这个可以体会replace和add的区别。
3、连续点两次Add:
08-02 12:05:55.441 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onAttach
08-02 12:05:55.441 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onCreate
08-02 12:05:55.441 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onCreateView
08-02 12:05:55.442 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onActivityCreated
08-02 12:05:55.442 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onStart
08-02 12:05:55.442 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onResume
08-02 12:05:57.719 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onAttach
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onCreate
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onCreateView
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onActivityCreated
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onStart
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onResume
连续两次replace:
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onPause
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onStop
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onDestroyView
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onAttach
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onCreate
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onCreateView
08-02 12:06:25.232 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onActivityCreated
08-02 12:06:25.232 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onStart
08-02 12:06:25.232 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onResume
08-02 12:06:25.482 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onPause
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onStop
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onDestroyView
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onAttach
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onCreate
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onCreateView
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onActivityCreated
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onStart
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment onResume
连续两次back:
08-02 12:07:05.323 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onDestroy
08-02 12:07:05.323 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onDetach
08-02 12:07:06.066 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onDestroy
08-02 12:07:06.066 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment onDetach
再次back就直接退出。
通过这个可以好好体会栈和add以及replace的关系。
总结:
1、一个FragmentTransaction只能commit()一次,所以每次最好重新构造一个,否则会抛出异常。
2、addToBackStack能够做到按照添加顺序一次退出,只要addToBackStack一次,栈中的对象就会多一次。
3、同一个Fragement对象只能add一次,否则会抛出java.lang.IllegalStateException: Fragment already added异常
4、同一个Fragement对象可以replace多次,但是只会存在一个实例,可以addToBackStack多次。
5.使用getSupportFragmentManager,当api>=14时,使用getFragmentManager(),有时候使用Fragment的时候为了兼容低版本,会引入android-support-v4.jar支持包,这个时候,需要使用getSupportFragmentManager()。
6.Fragment使用support.v4中的,为了兼容低版本的。
7、add会不断往frame容器中添加实例,而replace仅当容器为空的时候添加一个实例,之后只会不断替换原有的实例,不会增加容器中实例的数量。
8、replace的替换方式是从栈底的fragment实例开始替换。
9、add后添加进栈,退栈的时候只会执行自己的销毁操作;replace后添加进栈,退栈时除了执行自己的销毁操作,还会执行所替换的那个fragment的创建工作。
10、可以理解为栈可以保存到底是add还是replace的操作。
11、只有addToBackStack,再执行replace的时候只会执行到onDestroryView,而不执行onDestroty和onDetach。