實例講解Android應(yīng)用開發(fā)中Fragment生命周期的控制
一、Fragment的生命周期初探
因為Fragment必須嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相關(guān)的。
如果Activity是暫停狀態(tài),其中所有的Fragment都是暫停狀態(tài);如果Activity是stopped狀態(tài),這個Activity中所有的Fragment都不能被啟動;如果Activity被銷毀,那么它其中的所有Fragment都會被銷毀。
但是,當Activity在活動狀態(tài),可以獨立控制Fragment的狀態(tài),比如加上或者移除Fragment。
當這樣進行fragment transaction(轉(zhuǎn)換)的時候,可以把fragment放入Activity的back stack中,這樣用戶就可以進行返回操作。
使用Fragment時,需要繼承Fragment或者Fragment的子類(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代碼看起來和Activity的類似。
每當創(chuàng)建一個Fragment時,首先添加以下三個回調(diào)方法:
onCreate():系統(tǒng)在創(chuàng)建Fragment的時候調(diào)用這個方法,這里應(yīng)該初始化相關(guān)的組件,一些即便是被暫?;蛘弑煌V箷r依然需要保留的東西。
onCreateView():當?shù)谝淮卫L制Fragment的UI時系統(tǒng)調(diào)用這個方法,該方法將返回一個View,如果Fragment不提供 UI也可以返回null。注意,如果繼承自ListFragment,onCreateView()默認的實現(xiàn)會返回一個ListView,所以不用自己 實現(xiàn)。
onPause():當用戶離開Fragment時第一個調(diào)用這個方法,需要提交一些變化,因為用戶很可能不再返回來。
將Fragment加載到Activity當中有兩種方式:
方式一:添加Fragment到Activity的布局文件當中
方式二:在Activity的代碼中動態(tài)添加Fragment(薦)
第一種方式雖然簡單但靈活性不夠。添加Fragment到Activity的布局文件當中,就等同于將Fragment及其視圖與activity的視圖綁定在一起,且在activity的生命周期過程中,無法切換fragment視圖。
第二種方式比較復(fù)雜,但也是唯一一種可以在運行時控制fragment的方式(加載、移除、替換)。
二、生命周期控制實例
package com.goso.testapp; import android.app.Activity; import android.app.ListFragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; /** * Demonstration of using ListFragment to show a list of items * from a canned array. */ public class FragmentListArray extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("HJJ", "Activity &&&& onCreate..."); // Create the list fragment and add it as our sole content. if (getFragmentManager().findFragmentById(android.R.id.content) == null) { ArrayListFragment list = new ArrayListFragment(); getFragmentManager().beginTransaction().add(android.R.id.content, list).commit(); } } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.e("HJJ", "Activity &&&& onStart..."); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.e("HJJ", "Activity &&&& onResume..."); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.e("HJJ", "Activity &&&& onStop..."); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.e("HJJ", "Activity &&&& onPause..."); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.e("HJJ", "Activity &&&& onDestroy..."); } public static class ArrayListFragment extends ListFragment { @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub Log.e("HJJ", "ArrayListFragment **** onAttach..."); super.onAttach(activity); } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub Log.e("HJJ", "ArrayListFragment **** onCreate..."); super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub Log.e("HJJ", "ArrayListFragment **** onCreateView..."); return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.e("HJJ", "ArrayListFragment **** onActivityCreated..."); String[] array = new String[]{"C++", "JAVA", "PYTHON"}; setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, array)); } @Override public void onStart() { // TODO Auto-generated method stub Log.e("HJJ", "ArrayListFragment **** onStart..."); super.onStart(); } @Override public void onResume() { Log.e("HJJ", "ArrayListFragment **** onResume..."); // TODO Auto-generated method stub super.onResume(); } @Override public void onPause() { Log.e("HJJ", "ArrayListFragment **** onPause..."); // TODO Auto-generated method stub super.onPause(); } @Override public void onStop() { Log.e("HJJ", "ArrayListFragment **** onStop..."); // TODO Auto-generated method stub super.onStop(); } @Override public void onDestroyView() { Log.e("HJJ", "ArrayListFragment **** onDestroyView..."); // TODO Auto-generated method stub super.onDestroyView(); } @Override public void onDestroy() { // TODO Auto-generated method stub Log.e("HJJ", "ArrayListFragment **** onDestroy..."); super.onDestroy(); } @Override public void onDetach() { Log.e("HJJ", "ArrayListFragment **** onDetach..."); // TODO Auto-generated method stub super.onDetach(); } @Override public void onListItemClick(ListView l, View v, int position, long id) { Log.i("FragmentList", "Item clicked: " + id); } } }
結(jié)果:
onCreate過程
01-22 15:30:28.091: E/HJJ(10315): Activity &&&& onCreate... 01-22 15:30:28.091: E/HJJ(10315): ArrayListFragment **** onAttach... 01-22 15:30:28.091: E/HJJ(10315): ArrayListFragment **** onCreate... 01-22 15:30:28.115: E/HJJ(10315): ArrayListFragment **** onCreateView... 01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onActivityCreated...
onStart過程
01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onStart... 01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onStart...
onResume過程
01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onResume... 01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onResume...
onPause過程
01-22 15:31:26.748: E/HJJ(10315): ArrayListFragment **** onPause... 01-22 15:31:26.748: E/HJJ(10315): Activity &&&& onPause...
onStop過程
01-22 15:31:27.638: E/HJJ(10315): ArrayListFragment **** onStop... 01-22 15:31:27.638: E/HJJ(10315): Activity &&&& onStop...
onStart過程
01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onStart... 01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment **** onStart...
onResume過程
01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onResume... 01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment **** onResume...
onPause過程
01-22 15:32:47.412: E/HJJ(10315): ArrayListFragment **** onPause... 01-22 15:32:47.412: E/HJJ(10315): Activity &&&& onPause...
onStop過程
01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onStop... 01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onStop...
onDestroy過程
01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDestroyView... 01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDestroy... 01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDetach... 01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onDestroy...
- Android中使用DialogFragment編寫對話框的實例教程
- Android App在ViewPager中使用Fragment的實例講解
- Android中ViewPager實現(xiàn)滑動指示條及與Fragment的配合
- Android App中使用ViewPager+Fragment實現(xiàn)滑動切換效果
- 淺談Android App開發(fā)中Fragment的創(chuàng)建與生命周期
- Android應(yīng)用開發(fā)中Fragment與Activity間通信示例講解
- Android應(yīng)用開發(fā)中Fragment間通信的實現(xiàn)教程
- 淺談Android app開發(fā)中Fragment的Transaction操作
- Android app開發(fā)中的Fragment入門學(xué)習(xí)教程
- 實例探究Android應(yīng)用編寫時Fragment的生命周期問題
- Android應(yīng)用開發(fā)中使用Fragment的入門學(xué)習(xí)教程
- Android應(yīng)用開發(fā)中Fragment存儲功能的基本用法
- Android學(xué)習(xí)之Fragment
- 實例探究Android開發(fā)中Fragment狀態(tài)的保存與恢復(fù)方法
相關(guān)文章
Android編程基礎(chǔ)之簡單Button事件響應(yīng)綜合提示控件Toast應(yīng)用示例
這篇文章主要介紹了Android編程基礎(chǔ)之簡單Button事件響應(yīng)綜合提示控件Toast應(yīng)用,結(jié)合實例形式分析了Button事件響應(yīng)與Toast提醒的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10activity全屏實現(xiàn)沉浸式效果,并且單獨觸摸不會彈出虛擬按鍵的方法
今天小編就為大家分享一篇activity全屏實現(xiàn)沉浸式效果,并且單獨觸摸不會彈出虛擬按鍵的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Android Jetpack組件DataBinding詳解
這篇文章主要介紹了Android Jetpack組件DataBinding,DataBinding有很多優(yōu)勢,其中最明顯是代碼更加簡潔,可讀性會更高。部分和UI控件有關(guān)的代碼可以在布局文件當中完成,本文給大家詳細講解,需要的朋友可以參考下2022-10-10Android仿QQ復(fù)制昵稱效果的實現(xiàn)方法
這篇文章主要介紹了Android仿QQ復(fù)制昵稱效果的實現(xiàn)方法,主要依賴的是一個開源項目,需要的朋友可以參考下2019-05-05