Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android百日程序: Fragment動態管理和生命期

Android百日程序: Fragment動態管理和生命期

編輯:關於Android編程

之前寫過Fragment使用的程序,Fragment可以靜態,也可以動態載入內存中的,這一章進一步看看如何動態地更換Fragment和看看Fragment生命期都有什麼函數。


本章利用響應菜單點擊事件,輪流載入不同的Fragment,顯示不同的界面,效果如下:

開始的是沒有載入Fragmen為空白:

\

點擊菜單的NEXT FRAGMENT VIEW,就進入下一個界面,載入兩個:

\

繼續點擊顯示Fragment 1:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20150104/20150104091045125.jpg" width="130" height="230" alt="\">

繼續點擊,顯示Fragment2:

\

然後就是循環了:

\


如此循環顯示不同畫面。

一 首先實現這一效果的關鍵代碼,就是在菜單響應函數中輸入如下代碼:

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		switch (id) {			
		case R.id.next_fragment_view_menu_item: {
			FragmentManager fragManager = getFragmentManager();
			FragmentTransaction fragTrans = fragManager.beginTransaction();
			
			if (0 == turnNum) {
				Fragment1 frag1 = new Fragment1();
				Fragment2 frag2 = new Fragment2();
				fragTrans.replace(R.id.frame_layout1, frag1);
				fragTrans.replace(R.id.frame_layout2, frag2);
			} else if (1 == turnNum) {
				Fragment1 frag1 = new Fragment1();
				Fragment frag2 = fragManager.findFragmentById(R.id.frame_layout2);
				fragTrans.replace(R.id.frame_layout1, frag1);
				if (frag2 != null) fragTrans.remove(frag2);
			} else if (2 == turnNum) {
				Fragment frag1 = fragManager.findFragmentById(R.id.frame_layout1);
				Fragment2 frag2 = new Fragment2();
				if (frag1 != null) fragTrans.remove(frag1);
				fragTrans.replace(R.id.frame_layout2, frag2);
			}
			
			turnNum++;
			if (turnNum > 2) turnNum = 0;
			
			fragTrans.addToBackStack(null);
			fragTrans.commit();
			return true;
		}
		
		}
		return super.onOptionsItemSelected(item);
	}



1 FragmentManager 是管理所有Fragment的類,故此查找已有的Fragment使用函數: Fragment frag2 = fragManager.findFragmentByI(R.id.framelayout2);注意要判斷是否取回Fragment,如果沒有那麼frag2 == null。

2 FragmentTransaction管理Fragment變更事務,所有動作,如例子中的remove, replace,都必須是在beginTransaction()和commit()之間才會生效,重復調用commit而沒有調用beginTransaction會程序崩潰的。

3 addToBackStack(null),就是手動把Fragment放在棧中,這樣可以使用back按鍵退回上一層的Fragment安排。Activity是自動放到棧中的。

4 簡單邏輯:turnNum是全局變量,根據這個turnNum的值的不同使用不同的Fragment。

二 主界面的xml如下:



    <frameLayout
        android:id="@+id/frame_layout1"
        android:layout_weight="1"
        android:layout_width="0sp"
        android:layout_height="match_parent" />

    <frameLayout
        android:id="@+id/frame_layout2"
        android:layout_weight="1"
        android:layout_width="0sp"
        android:layout_height="match_parent" />



兩個FrameLayout用來裝Fragment


三 菜單res/menu/main.xml的代碼:



    



四 測試Fragment生命期的全部代碼:

package bill.su.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;

public class Fragment1 extends Fragment {
	private final String TAG = "FRAGMENTTAG1";
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		Log.d(TAG, "onCreateView called");
		
		return inflater.inflate(R.layout.fragment1, container, false);			
	}
	
	@Override
	public void onAttach(Activity activity){
		super.onAttach(activity);
		Log.d(TAG, "onAttach called");
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		Log.d(TAG, "onCreate called");
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState){
		super.onActivityCreated(savedInstanceState);
		Log.d(TAG, "onActivityCreted called");
	}
	
	@Override
	public void onStart(){
		super.onStart();
		Log.d(TAG, "onStart called");
	}
	
	@Override
	public void onResume() {
		super.onResume();
		Log.d(TAG, "onResume called");
	}
	
	@Override
	public void onPause() {
		super.onPause();
		Log.d(TAG, "onPause called");
	}
	
	@Override
	public void onStop(){
		super.onStop();
		Log.d(TAG, "onStop called");
	}
	
	@Override
	public void onDestroyView() {
		super.onDestroyView();
		Log.d(TAG, "onDestroyView called");
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d(TAG, "onDestroy called");
	}
	
	@Override
	public void onDetach() {
		super.onDetach();
		Log.d(TAG, "onDetach called");
	}
}

主要和Activity不同的是:

onAttached() : Fragment和Activity接起來的是調用

onCreateView(): Fragment的View創建

onActivityCreated():當Activity的onCreate()調用的時候調用

onDestroyView(): 當Fragment的view刪除的時候調用

onDetach(): Fragment從Activity中去掉的是調用




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved