一、建立、配置和使用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會經常在暫停和恢複之間進行狀态轉換。
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() //具體操作