天天看點

安卓基礎學習_Activity與Fragment

一、建立、配置和使用Activity
/*********************配置Activity********************/
<activity 
    android:name=".mainActivity"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:exported="true"
    android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
	<meta-data 
		android:name="com.zouyong.name" 
		android:value="zouyong"/>
</activity>
<meta-data>節點的使用
該節點可以包含在<activity><activity-alias><service><receiver>四個元素中,用于為元件提供額外的參數資料。
<activity android:name=".MainActivity">
	. . . . . .
	<meta-data android:name="com.zouyong.name" android:value="zouyong"/>
	<meta-data android:name="com.zouyong.age" android:value="5"/>
	<meta-data android:name="com.zouyong.app" android:value="@string/hello"/>
	<meta-data android:name="com.zouyong.id" android:resource="@string/hello"/>
</activity>
Activity中擷取參數:
try
{
	ActivityInfo activityInfo = this.getPackageManager().getActivityInfo(new ComponentName(this, MainActivity.class), PackageManager.GET_META_DATA);
	Bundle bundle = activityInfo.metaData;
	String name = bundle.getString("com.zouyong.name");
	String app = bundle.getString("com.zouyong.app");
	int age = bundle.getInt("com.zouyong.age");
	int sourceid = bundle.getInt("com.zouyong.id");
	Toast.makeText(this, "name="+ name+ ",age="+ age+ ",app="+ app+ ",sourceid="+ sourceid, 1).show();
} 
catch (NameNotFoundException e) 
{
	e.printStackTrace();
}

/*********************使用Activity********************/
// LauncherActivity
public class MainActivity extends LauncherActivity
{
	//定義兩個Activity的名稱
	String[] names = {"設定程式參數" ,  "檢視星際兵種"};
	//定義兩個Activity對應的實作類
	Class<?>[] clazzs = {PreferenceActivityTest.class
		, ExpandableListActivityTest.class};
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
			android.R.layout.simple_list_item_1 , names);
		// 設定該視窗顯示的清單所需的Adapter
		setListAdapter(adapter);
	}
	//根據清單項來傳回指定Activity對應的Intent
	@Override 
	public Intent intentForPosition(int position)
	{
		return new Intent(MainActivity.this , clazzs[position]);
	}
}
//ExpandableListActivity可展開的Activity
public class ExpandableListActivityTest extends ExpandableListActivity
{
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		ExpandableListAdapter adapter = new BaseExpandableListAdapter()
		{
			int[] logos = new int[]
			{
				R.drawable.p,
				R.drawable.z,
				R.drawable.t
			};
			private String[] armTypes = new String[]
				{ "神族兵種", "蟲族兵種", "人族兵種"};
			private String[][] arms = new String[][]
			{
				{ "狂戰士", "龍騎士", "黑暗聖堂", "電兵" },
				{ "小狗", "刺蛇", "飛龍", "自爆飛機" },
				{ "機槍兵", "護士MM" , "幽靈" }
			};
			//擷取指定組位置、指定子清單項處的子清單項資料
			@Override
			public Object getChild(int groupPosition, int childPosition)
			{
				return arms[groupPosition][childPosition];
			}
			@Override
			public long getChildId(int groupPosition, int childPosition)
			{
				return childPosition;
			}
			@Override
			public int getChildrenCount(int groupPosition)
			{
				return arms[groupPosition].length;
			}
			private TextView getTextView()
			{
				AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
						ViewGroup.LayoutParams.MATCH_PARENT, 64);
				TextView textView = new TextView(ExpandableListActivityTest.this);
				textView.setLayoutParams(lp);
				textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
				textView.setPadding(36, 0, 0, 0);
				textView.setTextSize(20);
				return textView;
			}
			//該方法決定每個子選項的外觀
			@Override
			public View getChildView(int groupPosition, int childPosition,
					boolean isLastChild, View convertView, ViewGroup parent)
			{
				TextView textView = getTextView();
				textView.setText(getChild(groupPosition, childPosition).toString());
				return textView;
			}
			//擷取指定組位置處的組資料
			@Override
			public Object getGroup(int groupPosition)
			{
				return armTypes[groupPosition];
			}
			@Override
			public int getGroupCount()
			{
				return armTypes.length;
			}
			@Override
			public long getGroupId(int groupPosition)
			{
				return groupPosition;
			}
			//該方法決定每個組選項的外觀
			@Override
			public View getGroupView(int groupPosition, boolean isExpanded,
					View convertView, ViewGroup parent)
			{
				LinearLayout ll = new 
LinearLayout(ExpandableListActivityTest.this);
				ll.setOrientation(0);
				ImageView logo = new ImageView(ExpandableListActivityTest.this);
				logo.setImageResource(logos[groupPosition]);
				ll.addView(logo);
				TextView textView = getTextView();
				textView.setText(getGroup(groupPosition).toString());
				ll.addView(textView);
				return ll;
			}
			@Override
			public boolean isChildSelectable(int groupPosition, int childPosition)
			{
				return true;
			}
			@Override
			public boolean hasStableIds()
			{
				return true;
			}
		};
		// 設定該視窗顯示清單
		setListAdapter(adapter);
	}
}
//PreferenceActivityTest
public class PreferenceActivityTest extends PreferenceActivity
{
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		// 該方法用于為該界面設定一個标題按鈕
		if (hasHeaders())
		{
			Button button = new Button(this);
			button.setText("設定操作");
			// 将該按鈕添加到該界面上
			setListFooter(button);
		}
	}
	// 重寫該該方法,負責加載頁面布局檔案
	@Override
	public void onBuildHeaders(List<Header> target)
	{
		// 加載選項設定清單的布局檔案
		loadHeadersFromResource(R.xml.preference_headers, target);
	}
	public static class Prefs1Fragment extends PreferenceFragment
	{
		@Override
		public void onCreate(Bundle savedInstanceState)
		{
			super.onCreate(savedInstanceState);
			addPreferencesFromResource(R.xml.preferences);
		}
	}
	public static class Prefs2Fragment extends PreferenceFragment
	{
		@Override
		public void onCreate(Bundle savedInstanceState)
		{
			super.onCreate(savedInstanceState);
			addPreferencesFromResource(R.xml.display_prefs);
			// 擷取傳入該Fragment的參數
			String website = getArguments().getString("website");
			Toast.makeText(getActivity()
				, "網站域名是:" + website , Toast.LENGTH_LONG).show();
		}
	}	
}
-------------------preference_headers.xml---------------
<preference-headers 
    xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 指定啟動指定PreferenceFragment的清單項 -->
	<header android:fragment=
	    "org.crazyit.app.PreferenceActivityTest$Prefs1Fragment"
		android:icon="@drawable/ic_settings_applications"
		android:title="程式選項設定"
		android:summary="設定應用的相關選項" />
<!-- 指定啟動指定PreferenceFragment的清單項 -->	
	<header android:fragment=
		"org.crazyit.app.PreferenceActivityTest$Prefs2Fragment"
		android:icon="@drawable/ic_settings_display"
		android:title="界面選項設定 "
		android:summary="設定顯示界面的相關選項">
		<!-- 使用extra可向Activity傳入額外的資料 -->
		<extra android:name="website"
			android:value="www.crazyit.org" />
	</header>
	<!-- 使用Intent啟動指定Activity的清單項 -->
	<header
		android:icon="@drawable/ic_settings_display"
		android:title="使用Intent"
		android:summary="使用Intent啟動某個Activity">
		<intent	android:action="android.intent.action.VIEW"
			android:data="http://www.crazyit.org" />
	</header>
</preference-headers>
--------------------display_prefs.xml--------------------
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
	<PreferenceCategory android:title="背景燈光組">
		<!-- 通過清單框選擇燈光強度 -->
		<ListPreference
			android:key="light"
			android:title="燈光強度"
			android:summary="請選擇燈光強度(測試ListPreference)"
			android:dialogTitle="請選擇燈光強度"
			android:entries="@array/light_strength_list"
			android:entryValues="@array/light_value_list" />
	</PreferenceCategory>
	<PreferenceCategory android:title="文字顯示組 ">
		<!-- 通過SwitchPreference設定是否自動滾屏 -->
		<SwitchPreference
			android:key="autoScroll"
			android:title="自動滾屏"
			android:summaryOn="自動滾屏: 開啟"
			android:summaryOff="自動滾屏: 關閉"
			android:defaultValue="true" />
	</PreferenceCategory>
</PreferenceScreen>
--------------------preferences.xml--------------------
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- 設定系統鈴聲 -->
	<RingtonePreference
		android:ringtoneType="all"
		android:title="設定鈴聲"
		android:summary="選擇鈴聲(測試RingtonePreference)"
		android:showDefault="true"
		android:key="ring_key"
		android:showSilent="true">
	</RingtonePreference>
	<PreferenceCategory android:title="個人資訊設定組">
		<!-- 通過輸入框填寫使用者名 -->
		<EditTextPreference
			android:key="name"
			android:title="填寫使用者名"
			android:summary="填寫您的使用者名(測試EditTextPreference)"
			android:dialogTitle="您所使用的使用者名為:" />
		<!-- 通過清單框選擇性别 -->
		<ListPreference
			android:key="gender"
			android:title="性别"
			android:summary="選擇您的性别(測試ListPreference)"
			android:dialogTitle="ListPreference"
			android:entries="@array/gender_name_list"
			android:entryValues="@array/gender_value_list" />
	</PreferenceCategory>
	<PreferenceCategory android:title="系統功能設定組 ">
		<CheckBoxPreference
			android:key="autoSave"
			android:title="自動儲存進度"
			android:summaryOn="自動儲存: 開啟"
			android:summaryOff="自動儲存: 關閉"
			android:defaultValue="true" />
	</PreferenceCategory>	
</PreferenceScreen>

/*********************Activity參數傳遞****************/
方法1:
intent.putExtra("name", "zhangsan");
startActivity(intent);
-----
String name=intent.getStringExtra("name");
方法2:
Bundle bundle=new Bundle();
bundle.putString("name", "zhangsan");
bundle.putInt("age", 22);
intent.putExtras(bundle);
startActivity(intent);
-----
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String name=bundle.getString("name");
int age=bundle.getInt("age");
方法3:
Bundle data = new Bundle();
data.putSerializable("person", p);
//Person p=new Person(..);
/*Person類實作了Serializable接口
public class Person implements Serializable
{
	private static final long serialVersionUID = 1L;
	...
}
*/
Intent intent = new Intent(BundleTest.this,ResultActivity.class);
intent.putExtras(data);
startActivity(intent);
-----
// 擷取啟動該Result的Intent
Intent intent = getIntent();
// 直接通過Intent取出它所攜帶的Bundle資料包中的資料
Person p = (Person) intent.getSerializableExtra("person");
在Activity關閉時傳回資料給main Activity:
啟動Activity方式:startActivityForResult(intent, 100);
關閉Activity時調用方法:
public void closeActivity(View view)//定義的按鈕點選事件
{
	Intent intent=new Intent();
	intent.putExtra("result", "Li Si");
	setResult(20,intent);
	finish();
}
接收結果資料:
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
	String result=data.getStringExtra("result");
	super.onActivityResult(requestCode, resultCode, data);
}

/*********************啟動Activity********************/
顯式Intent方式:
第1種:
Intent intent=new Intent(this,otheractivity.class);
startActivity(intent);
第2種:
Intent intent=new Intent();
intent.setClass(this, otheractivity.class);
startActivity(intent);
第3種:
Intent intent=new Intent();
intent.setClassName(this, "com.zouyong.zouyong.otheractivity");
startActivity(intent);
第4種:
Intent intent=new Intent();
intent.setComponent(new ComponentName(this, otheractivity.class));
startActivity(intent);
隐式Intent方式:
 (沒設資料參數的情況下)隻要Intent中的Action和Category都出現在Intent-Filter中,就能與之比對,否則比對失敗
Intent intent = new Intent();//隐式意圖激活Activity
intent.setAction("com.zouyong.intentaction0");
intent.addCategory("com.zouyong.category.java");
intent.setDataAndType(Uri.parse("zouyong://www.zouyong.cn/hello"), "image/jpeg");
startActivity(intent);//方法内部為Intent添加了android.intent.category.DEFAULT類别

/*********************關閉Activity********************/
1>.finish():結束目前Activity.
2>.finishActivity(int requestCode):
結束以startActivityForResult(Intent intent,int requestCode)方法啟動的Activity.
/*******************關閉應用的幾種方法******************/
第一種:首先擷取目前程序的id,然後殺死該程序(建議使用)
	android.process.killProcess(android.os.Process.myPid());
第二種:終止目前正在運作的java虛拟機,導緻程式終止
	System.exit(0);
第三種:強制關閉與該包有關聯的一切執行
	ActivityManager manager=(ActivityManager)getSystemService
(Context.ACTIVITY_SERVICE);
	manager.restartPackage(getPackageName());
<uses-permission android:name="android.permission.RESTART_PACKAGES" />

二、Activity的生命周期與加載模式
Activity有3個狀态:運作狀态、暫停狀态、停止狀态
運作(激活)狀态:處于棧頂(螢幕前台時,可以響應使用者操作);
暫停狀态:當Activity上面有另一個Activity,上面的activity沒有完全覆寫它,或者上面的activity是透明的,下方的activity仍然對使用者可見(對話框);是存活狀态,如果記憶體不足時,會殺死這個activity;
停止狀态:當activity完全被令一個activity覆寫時,處于停止狀态。它仍然保留所有的狀态和成員資訊,然而對使用者是不可見的,是以它的視窗将被隐藏,如果其他地方需要記憶體,系統經常會殺死這個activity。

當Activity從一種狀态轉變到另一種狀态時,會調用以下保護方法來通知這種變化:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()

1.啟動Activity:系統會先調用onCreate方法(适合做初始化操作),然後調用onStart方法,最後調用onResume,Activity進入運作狀态。
2.目前Activity被其他Activity覆寫其上或被鎖屏:系統會調用onPause方法,暫停目前Activity的執行。
3.目前Activity由被覆寫狀态回到前台或解鎖屏:系統會調用onResume方法,再次進入運作狀态。
4.目前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居背景:系統會先調用onPause方法,然後調用onStop方法,進入停滞狀态。
5.使用者後退回到此Activity:系統會先調用onRestart方法,然後調用onStart方法,最後調用onResume方法,再次進入運作狀态。
6.目前Activity處于被覆寫狀态或者背景不可見狀态,即第2步和第4步,系統記憶體不足,殺死目前Activity,而後使用者退回目前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運作狀态。
7.使用者退出目前Activity:系統先調用onPause方法,然後調用onStop方法,最後調用onDestory方法,結束目前Activity。

Activity的完整生命周期:自第一次調用onCreate()開始,直至調用onDestrory()為止。Activity在onCreate()設定所有“全局”狀态以完成初始化,而在onDestrory()中釋放所有的系統資源。
Activity的可視生命周期:自onStart()調用開始直到響應的onStop()調用結束。在此期間,使用者可以在螢幕上看到activity,盡管它也許并不是位于前台或者也不與使用者進行互動。在這兩個方法之間,我們可以保留用來向使用者顯示這個activity所需要的資源。
Activity的前台生命周期:自onResume()調用起,至相應的onPause()調用為止,在此期間,Activity位于前台最上面并于使用者進行互動。Activity會經常在暫停和恢複之間進行狀态轉換。      
安卓基礎學習_Activity與Fragment
    onSaveInstanceState()和onRestoreInstanceState并不是生命周期方法,它們不同于onCreate(),onPause()等生命周期方法,它們并不一定被觸發。當遇到意外情況(記憶體不足,使用者直接按Home鍵)由系統銷毀一個Activity時,onSaveInstanceState()會被調用,另外Activity由于運作狀态進入暫停狀态或停止狀态也會調用該方法。但是當使用者主動去銷毀一個Activity時,例如在應用中按傳回鍵,onSaveInstanceState()就不會被調用。因為在這種情況下,使用者的行為決定了不需要儲存Activity的狀态。通常onSaveInstanceState()隻适合用于儲存一些臨時性的狀态,而onPause()适合使用者資料的持久化儲存。
    另外,當螢幕方向發生了改變,Activity會被摧毀并且被重新建立,如果你想在Activity被摧毀前緩存一些資料,并且在Activity被重新建立後恢複緩存的資料,可以重寫Activity的onSaveInstanceState()和onRestoreInstanceStance()方法。
//被摧毀前緩存一些資料
protected void onSaveInstanceState(Bundle outState)
{
	outState.putString("name", "zhangsan");
	super.onSaveInstanceState(outState);
}
//被重新建立後恢複緩存的資料
protected void onRestoreInstanceState(Bundle savedInstanceState) 
{
	String name=savedInstanceState.getString("name");
	super.onRestoreInstanceState(savedInstanceState);
}

預設情況下,當螢幕方向或鍵盤顯示隐藏變化時都會銷毀目前Activity,建立新的Activity,如果不希望重新建立Activity執行個體,可以按如下配置Activity:
android:configChanges="keyboardHidden|orientation"

Activity的四種啟動模式(LaunchMode):
1. Standard:預設模式,标準模式。每次激活Activity都會建立Activity執行個體,并放入任務棧中。
2. SingleTop:如果在任務的棧頂正好存在該Activity的執行個體,就重用該執行個體(會調用onNewIntent()),否則就會建立新的執行個體并放入棧頂(注:即使棧中已經存在該Activity執行個體,隻有不在棧頂,都會建立執行個體)。
3. SingleTask:如果在棧中已經有該Activity的執行個體,就重用該執行個體(會調用onNewIntent()),重用時,會讓該執行個體回到棧頂,是以在它上面的執行個體将被移出棧。如果棧中不存在該執行個體,将會建立新的執行個體放入棧中。
4. SingleInstance:在一個新棧中建立該Activity的執行個體,并讓多個應用共享該棧中的該Activity執行個體。一旦該模式的Activity的執行個體已經存在與某個棧中,任何應用再激活該Activity時都會重用該棧中的執行個體(會調用執行個體的onNewIntent())。其效果相同于多個應用共享一個應用,不管誰激活該Activity都會進入同一個應中。

三、Fragment詳解
系統内置了三種Fragments ,這三種Fragments 分别有不同的應用場景分别為:
1.DialogFragment:對話框式的Fragments,可以将一個fragments 對話框并到activity 管理的fragments back stack 中,允許使用者回到一個前曾摒棄fragments. 
2.ListFragments:類似于ListActivity 的效果,并且還提供了ListActivity 類似的onListItemCLick和setListAdapter等功能.
3.PreferenceFragments:類似于PreferenceActivity .

将Fragment添加到Activity中的兩種方式
1.在布局檔案中使用<fragment.../>元素添加,<fragment../>元素的android:name屬性指定Fragment的實作類;
2.在java代碼中通過FragmentTransaction對象的add()方法來添加Fragment.Activity的getFragmentManager()方法可傳回FragmentManager,FragmentManager對象的beginTransaction()方法即可開啟并傳回FragmentTransaction對象.

Fragment擷取它所在Activity:調用Fragment的getActivity()方法即可傳回.
Activity擷取它所包含的Fragment:調用Activity關聯的FragmentManger的findFragmentById(int id)或findFragmentByTag(String tag)方法即可擷取.

Fragment與Activity通信
Activity向Fragment傳遞資料:在Activity中建立Bundle資料包,并調用Fragment的setArguments(Bundle bundle)方法即可将Bundle資料包傳給Fragment.
Fragment向Activity傳遞資料或Activity需要在Fragment運作中實時通信:在Fragment中定義一個内部回調接口,再讓包含該Fragment的Activity實作該回調接口,這樣Fragment即可調用該回調方法将資料傳給Activity.

Fragment的管理與Fragment事務(Activity管理Fragment主要依靠FragmentManager)
FragmentManager可以完成如下幾方面功能
1.使用findFragmentById(int id)或findFragmentByTag(String tag)方法擷取指定Fragment;
2.調用popBackStack()方法将Fragment從背景棧中彈出;
3.調用addOnBackStackChangeListener()注冊一個監聽器,用于監聽背景棧的變化.

public class BookListActivity extends Activity implements
		BookListFragment.Callbacks
{
	// 定義一個旗标,用于辨別該應用是否支援大螢幕
	private boolean mTwoPane;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		// 指定加載R.layout.activity_book_list對應的界面布局檔案
		// 但實際上該應用會根據螢幕分辨率家在不同的界面布局檔案
/*螢幕适配-->建立values-sw600dp、values-large檔案夾,建立refs.xml檔案如下
<resources>
	<item type="layout" name="activity_book_list">
		@layout/activity_book_twopane
	</item>
</resources>
*/
		setContentView(R.layout.activity_book_list);
		// 如果加載的界面布局檔案中包含ID為book_detail_container的元件
		if (findViewById(R.id.book_detail_container) != null)
		{
			mTwoPane = true;
			((BookListFragment) getFragmentManager()
				.findFragmentById(R.id.book_list))
				.setActivateOnItemClick(true);
		}
	}
	@Override
	public void onItemSelected(Integer id)
	{
		if (mTwoPane)
		{
			// 建立Bundle,準備向Fragment傳入參數
			Bundle arguments = new Bundle();
			arguments.putInt(BookDetailFragment.ITEM_ID, id);
			// 建立BookDetailFragment對象
			BookDetailFragment fragment = new BookDetailFragment();
			// 向Fragment傳入參數
			fragment.setArguments(arguments);
			// 使用fragment替換book_detail_container容器目前顯示的Fragment
			getFragmentManager().beginTransaction()
					.replace(R.id.book_detail_container, fragment).commit();
		}
		else
		{
			// 建立啟動BookDetailActivity的Intent
			Intent detailIntent = new Intent(this, BookDetailActivity.class);
			// 設定傳給BookDetailActivity的參數
			detailIntent.putExtra(BookDetailFragment.ITEM_ID, id);
			// 啟動Activity
			startActivity(detailIntent);
		}
	}
}

activity_book_list.xml
<!-- 直接使用BookListFragment作為界面元件 -->
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
	android:name="org.crazyit.app.BookListFragment"
	android:id="@+id/book_list"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:layout_marginLeft="16dp"
	android:layout_marginRight="16dp"/>

activity_book_twopane.xml
<!-- 定義一個水準排列的LinearLayout,并指定使用中等分隔條 -->
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:layout_marginLeft="16dp"
	android:layout_marginRight="16dp"
	android:divider="?android:attr/dividerHorizontal"
	android:showDividers="middle">
	<!-- 添加一個Fragment -->
	<fragment
		android:name="org.crazyit.app.BookListFragment"
		android:id="@+id/book_list"
		android:layout_width="0dp"
		android:layout_height="match_parent"
		android:layout_weight="1" />
	<!-- 添加一個FrameLayout容器 -->
	<FrameLayout
		android:id="@+id/book_detail_container"
		android:layout_width="0dp"
		android:layout_height="match_parent"
		android:layout_weight="3" />
</LinearLayout>

public class BookListFragment extends ListFragment
{
	private Callbacks mCallbacks;
	public interface Callbacks
	{
		public void onItemSelected(Integer id);
	}
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		// 為該ListFragment設定Adapter
		setListAdapter(new ArrayAdapter<BookContent.Book>(getActivity(),
				android.R.layout.simple_list_item_activated_1,
				android.R.id.text1, BookContent.ITEMS));  //①
	}
	// 當該Fragment被添加、顯示到Activity時,回調該方法
	@Override
	public void onAttach(Activity activity)
	{
		super.onAttach(activity);
		// 如果Activity沒有實作Callbacks接口,抛出異常
		if (!(activity instanceof Callbacks))
		{
			throw new IllegalStateException(
				"BookListFragment所在的Activity必須實作Callbacks接口!");
		}
		// 把該Activity當成Callbacks對象
		mCallbacks = (Callbacks) activity;
	}
	// 當該Fragment從它所屬的Activity中被删除時回調該方法
	@Override
	public void onDetach()
	{
		super.onDetach();
		// 将mCallbacks賦為null。
		mCallbacks = null;
	}
	// 當使用者點選某清單項時回調該方法
	@Override
	public void onListItemClick(ListView listView
		, View view, int position, long id)
	{
		super.onListItemClick(listView, view, position, id);
		mCallbacks.onItemSelected(BookContent.ITEMS.get(position).id);
	}
	public void setActivateOnItemClick(boolean activateOnItemClick)
	{
		getListView().setChoiceMode(
				activateOnItemClick ? ListView.CHOICE_MODE_SINGLE
						: ListView.CHOICE_MODE_NONE);
	}
}

public class BookDetailActivity extends Activity
{
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		// 指定加載/res/layout目錄下的activity_book_detail.xml布局檔案
		// 該界面布局檔案内隻定義了一個名為book_detail_container的FrameLayout
		setContentView(R.layout.activity_book_detail);
		// 将ActionBar上應用圖示轉換成可點選的按鈕
		getActionBar().setDisplayHomeAsUpEnabled(true);
		if (savedInstanceState == null)
		{
			// 建立BookDetailFragment對象
			BookDetailFragment fragment = new BookDetailFragment();
			// 建立Bundle對象,
			Bundle arguments = new Bundle();
			arguments.putInt(BookDetailFragment.ITEM_ID, getIntent()
				.getIntExtra(BookDetailFragment.ITEM_ID, 0));
			// 向Fragment傳入參數
			fragment.setArguments(arguments);
			// 将指定fragment添加到book_detail_container容器中
			getFragmentManager().beginTransaction()
					.add(R.id.book_detail_container, fragment).commit();
		}
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		if (item.getItemId() == android.R.id.home)
		{
			// 建立啟動BookListActivity的Intent
			Intent intent = new Intent(this, BookListActivity.class);
			// 添加額外的Flag,将Activity棧中處于FirstActivity之上的Activity彈出
			intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			// 啟動intent對應的Activity
			startActivity(intent);
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

public class BookDetailFragment extends Fragment
{
	public static final String ITEM_ID = "item_id";
	// 儲存該Fragment顯示的Book對象
	BookContent.Book book;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		// 如果啟動該Fragment時包含了ITEM_ID參數
		if (getArguments().containsKey(ITEM_ID))
		{
			book = BookContent.ITEM_MAP.get(getArguments()
				.getInt(ITEM_ID));
		}
	}
	// 重寫該方法,該方法傳回的View将作為Fragment顯示的元件
	@Override
	public View onCreateView(LayoutInflater inflater
		, ViewGroup container, Bundle savedInstanceState)
	{
		// 加載/res/layout/目錄下的fragment_book_detail.xml布局檔案
		View rootView = inflater.inflate(R.layout.fragment_book_detail,
				container, false);
		if (book != null)
		{
			// 讓book_title文本框顯示book對象的title屬性
			((TextView) rootView.findViewById(R.id.book_title))
					.setText(book.title);
			// 讓book_desc文本框顯示book對象的desc屬性
			((TextView) rootView.findViewById(R.id.book_desc))
				.setText(book.desc);		
		}
		return rootView;
	}
}

model層
public class BookContent
{
	public static class Book
	{


		public Integer id;
		public String title;
		public String desc;
		
		public Book(Integer id, String title, String desc)
		{
			this.id = id;
			this.title = title;
			this.desc = desc;
		}


		@Override
		public String toString()
		{
			return title;
		}
	}


	public static List<Book> ITEMS = new ArrayList<Book>();
	public static Map<Integer, Book> ITEM_MAP 
		= new HashMap<Integer, Book>();


	static
	{
		addItem(new Book(1, "瘋狂Java講義"
			, "一本全面、深入的Java學習圖書,已被多家高校選做教材。"));
		addItem(new Book(2, "瘋狂Android講義"
			, "Android學習者的首選圖書,常年占據京東、當當、亞馬遜3大網站Android銷量排行榜的榜首"));
		addItem(new Book(3, "輕量級Java EE企業應用實戰"
			, "全面介紹Java EE開發的Struts 2、Spring 3、Hibernate 4架構"));
	}
	
	private static void addItem(Book book)
	{
		ITEMS.add(book);
		ITEM_MAP.put(book.id, book);
	}
}

四、Fragment的生命周期
Fragment存在狀态:
1.活動狀态:位于前台,使用者可見,可以獲得焦點
2.暫停狀态:位于前台,依然可見。不能獲得焦點
3.停止狀态:不可見,失去焦點

--------------添加Fragment----------------------
1.當fragment被建立的時候,它會經曆以下狀态.
onAttach():當該Fragment被添加到Activity時被回調,隻會被調用一次;
onCreate():建立Fragment時被回調,隻會被調用一次;當fragment和activity關聯之後,調用這個方法.
onCreateView():每次建立、繪制該Fragment的View元件時回調該方法,Fragment将會顯示該方法傳回的View元件;
onActivityCreated():當Fragment所在Activity被啟動完成後回調該方法;當activity的onCreate()方法被傳回之後,調用這個方法.
2.當這個fragment對使用者可見的時候,它會經曆以下狀态。
onStart():啟動Fragment時被回調;
onResume():恢複Fragment時被回調,onStart()方法後一定回調onResume();
--------------運作狀态---------------------
3.進入"背景模式"/fragment被銷毀了/持有它的activity被銷毀了會經曆以下狀态.
onPause():暫停Fragment時被回調;
--------------暫停狀态----------------------
onStop():停止Fragment時被回調;
--------------停止狀态----------------------
onDestroyView():銷毀Fragment所包含的View元件時被回調;當fragment中的視圖被移除的時候,調用這個方法.
onDestroy():銷毀Fragment時被回調,隻會調用一次;
onDetach():将Fragment從Activity中删除,被替換完成時回調該方法,onDestroy()方法後一定會回調該方法,隻會被調用一次;當fragment和activity分離的時候調用.
--------------銷毀狀态----------------------
在以下的狀态中,可以使用Bundle對象儲存一個fragment的對象.
onCreate()    //儲存的資料恢複
onCreateView() //初始化UI
onActivityCreated()   //具體操作      
安卓基礎學習_Activity與Fragment