在上一篇博客,Android-fragment簡介-fragment的簡單使用,介紹了fragment簡單的使用,還介紹了fragment簡介(fragment是有生命周期的)
必須知道fragment生命周期,才能正確的使用fragment:
MyTestFragmentActivity3
package liudeli.activity.fragment; import android.app.Activity; import android.os.Bundle; import android.util.Log; import liudeli.activity.R; public class MyTestFragmentActivity3 extends Activity { private final String TAG = MyFragment3.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_fragment3); Log.i(TAG, "Activity onCreate"); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "Activity onStart"); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "Activity onResume"); } /***** 當一個Activity不再被使用時,它會經歷一系列反向回調:*****/ @Override protected void onPause() { super.onPause(); Log.i(TAG, "Activity onPause"); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "Activity onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "Activity onDestroy"); } }
R.layout.activity_test_fragment3 Activity布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/fragment" class="liudeli.activity.fragment.MyFragment3" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
MyFragment3 生命周期
package liudeli.activity.fragment; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Fragment的生命周期 */ public class MyFragment3 extends Fragment { private final String TAG = MyFragment3.class.getSimpleName(); /** * 當Fragment附加到Activity之上時調用此方法 * @param activity */ @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onAttach()"); } /** * 當Fragment初始化時調用此方法 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onCreate()"); } /** * 當Fragment創建View(1.布局加載加載Layout 2.new View)並返回 * @param inflater 布局加載器 用來加載布局 * @param container * @param savedInstanceState 保存臨時數據,和Activity的onCreate->savedInstanceState 一樣 * @return */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onCreateView()"); TextView tv = new TextView(getActivity()); // 在Fragment不能使用this /** * 注意:⚠️ 此方法必須要返回View,否則會報錯 */ return tv; } /** * Activity已創建完成 * @param savedInstanceState 保存臨時數據,和Activity的onCreate->savedInstanceState 一樣 */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onActivityCreated()"); } /** * 當Fragment啟動 */ @Override public void onStart() { super.onStart(); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onStart()"); } /** * 當Fragment活躍在前台顯示 */ @Override public void onResume() { super.onResume(); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onResume()"); } /***** 當一個片段不再被使用時,它會經歷一系列反向回調:*****/ /** * 當Fragment不再前台 */ @Override public void onPause() { super.onPause(); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onPause()"); } /** * 當Fragment不再前台 不完全顯示 會 onStop */ @Override public void onStop() { super.onStop(); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onStop()"); } /** * 當Fragment銷毀自己的控件 */ @Override public void onDestroyView() { super.onDestroyView(); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onDestroyView()"); } /** * 當Fragment銷毀自己 */ @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onDestroy()"); } /** * 當Fragment 離開 Activity (不附加在Activity之上了 離開了) */ @Override public void onDetach() { super.onDetach(); Log.d(TAG, ">>>>>>>>>>>>>>> MyFragment onDetach()"); } }
以下動態有兩個動作
動作一:Fragment 附加到 Activity 上
動作二:Fragment 離開Activity
打開 --> Activity--> layout<fragment class --> fragment
1.Fragment附加到Activity之上 ,執行onAttach方法
2.Fragment創建啦,執行onCreate方法
3.Fragment的View創建啦,執行onCreateView方法
4.Activity的onCreate執行了
5.Fragment收到Activity創建好啦,執行onActivityCreated方法
6.Activity的onStart執行了
7.Fragment啟動啦,執行onStart方法
8.Activity的onResume執行了
9.Fragment顯示到前台啦,執行onResume方法
點擊返回(關閉) --> Activity--> layout<fragment class --> fragment
1.Fragment暫停啦,執行onPause方法
2.Activity的onPause執行了
3.Fragment停止了,執行onStop方法
4.Activity的onStop執行了
5.Fragment銷毀自己的控件,執行onDestroyView方法
6.Fragment銷毀自己,執行onDestroy方法
7.Fragment離開Activity,不再附近啦,執行onDetach方法
8.Activity銷毀了,執行onDestroy方法
打開 --> Activity--> layout<fragment class --> fragment
12-26 02:07:35.066 5493-5493/? D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onAttach()
12-26 02:07:35.066 5493-5493/? D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onCreate()
12-26 02:07:35.066 5493-5493/? D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onCreateView()
12-26 02:07:35.068 5493-5493/? I/MyFragment3: onCreate
12-26 02:07:35.068 5493-5493/? D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onActivityCreated()
12-26 02:07:35.069 5493-5493/? I/MyFragment3: onStart
12-26 02:07:35.069 5493-5493/? D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onStart()
12-26 02:07:35.069 5493-5493/? I/MyFragment3: onResume
12-26 02:07:35.069 5493-5493/? D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onResume()
點擊返回(關閉) --> Activity--> layout<fragment class --> fragment
12-26 02:14:17.461 5792-5792/liudeli.activity D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onPause()
12-26 02:14:17.461 5792-5792/liudeli.activity I/MyFragment3: Activity onPause
12-26 02:14:18.029 5792-5792/liudeli.activity D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onStop()
12-26 02:14:18.029 5792-5792/liudeli.activity I/MyFragment3: Activity onStop
12-26 02:14:18.029 5792-5792/liudeli.activity D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onDestroyView()
12-26 02:14:18.029 5792-5792/liudeli.activity D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onDestroy()
12-26 02:14:18.029 5792-5792/liudeli.activity D/MyFragment3: >>>>>>>>>>>>>>> MyFragment onDetach()
12-26 02:14:18.029 5792-5792/liudeli.activity I/MyFragment3: Activity onDestroy