實(shí)例講解Android應(yīng)用開(kāi)發(fā)中Fragment生命周期的控制
一、Fragment的生命周期初探
因?yàn)镕ragment必須嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相關(guān)的。
如果Activity是暫停狀態(tài),其中所有的Fragment都是暫停狀態(tài);如果Activity是stopped狀態(tài),這個(gè)Activity中所有的Fragment都不能被啟動(dòng);如果Activity被銷毀,那么它其中的所有Fragment都會(huì)被銷毀。
但是,當(dāng)Activity在活動(dòng)狀態(tài),可以獨(dú)立控制Fragment的狀態(tài),比如加上或者移除Fragment。
當(dāng)這樣進(jìn)行fragment transaction(轉(zhuǎn)換)的時(shí)候,可以把fragment放入Activity的back stack中,這樣用戶就可以進(jìn)行返回操作。
使用Fragment時(shí),需要繼承Fragment或者Fragment的子類(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代碼看起來(lái)和Activity的類似。
每當(dāng)創(chuàng)建一個(gè)Fragment時(shí),首先添加以下三個(gè)回調(diào)方法:
onCreate():系統(tǒng)在創(chuàng)建Fragment的時(shí)候調(diào)用這個(gè)方法,這里應(yīng)該初始化相關(guān)的組件,一些即便是被暫?;蛘弑煌V箷r(shí)依然需要保留的東西。
onCreateView():當(dāng)?shù)谝淮卫L制Fragment的UI時(shí)系統(tǒng)調(diào)用這個(gè)方法,該方法將返回一個(gè)View,如果Fragment不提供 UI也可以返回null。注意,如果繼承自ListFragment,onCreateView()默認(rèn)的實(shí)現(xiàn)會(huì)返回一個(gè)ListView,所以不用自己 實(shí)現(xiàn)。
onPause():當(dāng)用戶離開(kāi)Fragment時(shí)第一個(gè)調(diào)用這個(gè)方法,需要提交一些變化,因?yàn)橛脩艉芸赡懿辉俜祷貋?lái)。
將Fragment加載到Activity當(dāng)中有兩種方式:
方式一:添加Fragment到Activity的布局文件當(dāng)中
方式二:在Activity的代碼中動(dòng)態(tài)添加Fragment(薦)
第一種方式雖然簡(jiǎn)單但靈活性不夠。添加Fragment到Activity的布局文件當(dāng)中,就等同于將Fragment及其視圖與activity的視圖綁定在一起,且在activity的生命周期過(guò)程中,無(wú)法切換fragment視圖。
第二種方式比較復(fù)雜,但也是唯一一種可以在運(yùn)行時(shí)控制fragment的方式(加載、移除、替換)。
二、生命周期控制實(shí)例
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過(guò)程
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過(guò)程
01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onStart... 01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onStart...
onResume過(guò)程
01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onResume... 01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment **** onResume...
onPause過(guò)程
01-22 15:31:26.748: E/HJJ(10315): ArrayListFragment **** onPause... 01-22 15:31:26.748: E/HJJ(10315): Activity &&&& onPause...
onStop過(guò)程
01-22 15:31:27.638: E/HJJ(10315): ArrayListFragment **** onStop... 01-22 15:31:27.638: E/HJJ(10315): Activity &&&& onStop...
onStart過(guò)程
01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onStart... 01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment **** onStart...
onResume過(guò)程
01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onResume... 01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment **** onResume...
onPause過(guò)程
01-22 15:32:47.412: E/HJJ(10315): ArrayListFragment **** onPause... 01-22 15:32:47.412: E/HJJ(10315): Activity &&&& onPause...
onStop過(guò)程
01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onStop... 01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onStop...
onDestroy過(guò)程
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編寫(xiě)對(duì)話框的實(shí)例教程
- Android App在ViewPager中使用Fragment的實(shí)例講解
- Android中ViewPager實(shí)現(xiàn)滑動(dòng)指示條及與Fragment的配合
- Android App中使用ViewPager+Fragment實(shí)現(xiàn)滑動(dòng)切換效果
- 淺談Android App開(kāi)發(fā)中Fragment的創(chuàng)建與生命周期
- Android應(yīng)用開(kāi)發(fā)中Fragment與Activity間通信示例講解
- Android應(yīng)用開(kāi)發(fā)中Fragment間通信的實(shí)現(xiàn)教程
- 淺談Android app開(kāi)發(fā)中Fragment的Transaction操作
- Android app開(kāi)發(fā)中的Fragment入門(mén)學(xué)習(xí)教程
- 實(shí)例探究Android應(yīng)用編寫(xiě)時(shí)Fragment的生命周期問(wèn)題
- Android應(yīng)用開(kāi)發(fā)中使用Fragment的入門(mén)學(xué)習(xí)教程
- Android應(yīng)用開(kāi)發(fā)中Fragment存儲(chǔ)功能的基本用法
- Android學(xué)習(xí)之Fragment
- 實(shí)例探究Android開(kāi)發(fā)中Fragment狀態(tài)的保存與恢復(fù)方法
相關(guān)文章
Android監(jiān)聽(tīng)軟鍵盤(pán)彈出與隱藏的兩種方法
本篇文章主要介紹了Android監(jiān)聽(tīng)軟鍵盤(pán)彈出與隱藏的兩種方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04Android仿探探卡片式滑動(dòng)效果實(shí)現(xiàn)
之前在玩探探看著效果圖還可以,然后又在網(wǎng)上看到了一相關(guān)的介紹,便想著自己動(dòng)手來(lái)實(shí)踐下,所以下面這篇文章主要介紹了關(guān)于Android實(shí)現(xiàn)仿探探卡片式左右滑動(dòng)效果的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-03-03Android編程基礎(chǔ)之簡(jiǎn)單Button事件響應(yīng)綜合提示控件Toast應(yīng)用示例
這篇文章主要介紹了Android編程基礎(chǔ)之簡(jiǎn)單Button事件響應(yīng)綜合提示控件Toast應(yīng)用,結(jié)合實(shí)例形式分析了Button事件響應(yīng)與Toast提醒的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10activity全屏實(shí)現(xiàn)沉浸式效果,并且單獨(dú)觸摸不會(huì)彈出虛擬按鍵的方法
今天小編就為大家分享一篇activity全屏實(shí)現(xiàn)沉浸式效果,并且單獨(dú)觸摸不會(huì)彈出虛擬按鍵的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Android Jetpack組件DataBinding詳解
這篇文章主要介紹了Android Jetpack組件DataBinding,DataBinding有很多優(yōu)勢(shì),其中最明顯是代碼更加簡(jiǎn)潔,可讀性會(huì)更高。部分和UI控件有關(guān)的代碼可以在布局文件當(dāng)中完成,本文給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10Android仿QQ復(fù)制昵稱效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Android仿QQ復(fù)制昵稱效果的實(shí)現(xiàn)方法,主要依賴的是一個(gè)開(kāi)源項(xiàng)目,需要的朋友可以參考下2019-05-05Handler消息傳遞機(jī)制類引入及執(zhí)行流程詳解
這篇文章主要為大家介紹了Handler消息傳遞機(jī)制類引入及執(zhí)行流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04