實(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編寫對(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入門學(xué)習(xí)教程
- 實(shí)例探究Android應(yīng)用編寫時(shí)Fragment的生命周期問(wèn)題
- Android應(yīng)用開(kāi)發(fā)中使用Fragment的入門學(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開(kāi)發(fā)之模仿微信打開(kāi)網(wǎng)頁(yè)的進(jìn)度條效果(高仿)
這篇文章主要介紹了Android開(kāi)發(fā)之模仿微信打開(kāi)網(wǎng)頁(yè)的進(jìn)度條效果(高仿)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
Android控件動(dòng)態(tài)用法實(shí)例分析
這篇文章主要介紹了Android控件動(dòng)態(tài)用法,以實(shí)例形式較為詳細(xì)的分析了Android控件動(dòng)態(tài)的具體編程實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Jetpack?Compose?實(shí)現(xiàn)一個(gè)圖片選擇框架功能
這篇文章主要介紹了Jetpack?Compose?實(shí)現(xiàn)一個(gè)圖片選擇框架,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Android 如何實(shí)現(xiàn)動(dòng)態(tài)申請(qǐng)權(quán)限
這篇文章主要介紹了Android 如何實(shí)現(xiàn)動(dòng)態(tài)申請(qǐng)權(quán)限。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
DownloadManager實(shí)現(xiàn)文件下載功能
這篇文章主要為大家詳細(xì)介紹了DownloadManager實(shí)現(xiàn)文件下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
loadavg數(shù)據(jù)異常引發(fā)問(wèn)題起源分析
這篇文章主要為大家介紹了loadavg數(shù)據(jù)異常引發(fā)問(wèn)題起源分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

