想實現圖標向上導航功能,步子分兩步走:
1.樣式上要改變-->圖標要變成可點擊的按鈕,並有一個向左的箭頭。
2.功能上要實現-->實現向上導航
首先談第一步:
對於擁有fragment的activity來說,想要讓圖標具有向上導航的功能,需要在fragment中設置activity的actionBar的showHomeAsUp的值為true。
值得讀者注意的是,由於setDisplayHomeAsUpEnabled()方法是在API11以后出現的,因此我們需要采取兼容措施:
1.增加TargetApi注釋,避免Android Lint報錯
2.進行系統版本判斷實現向下兼容
再來談第二步:無論什么功能,都應該在響應方法里寫。
請讀者參考http://www.cnblogs.com/JiMoRuXue/p/5048297.html,了解選項菜單的創建,響應。
這里和選項菜單類似:
首先在fragment中設置HasOptionsMenu的值為true(目的是告訴FragmentManager,該fragment要代表其所在activity實現選項菜單的回調方法)
然后重寫onOptionsItemSelected(MenuItem item)方法。
值得注意的是,選項菜單具有自己的xml視圖以及item的資源ID,但是圖標已具有現成的資源ID:android.R.id.home
現在我們需要做的是什么呢?可能大部分人想到的是用startActivity(i)跳轉到上層的activity。這里引入一個重要的知識點:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP),該方法會讓系統首先在回退棧中尋找指定activity的實例,如存在,就彈出在實例activity上面的所有activity,讓啟動的activity出現在棧頂。
不過還有另一種更好的實現層級式導航的方法:NavUtils類+manifest元數據
步驟如下:
1.在manifest為activity添加元數據(name="android.support.PARENT_ACTIVITY"),這個元數據描述了該Activity的父級Activity
2.調用NavUtils.getParentActivityName(Activity),檢查元數據中是否指定了父級Activity,如指定有,執行3
3.調用NavUtils.navigateUpFromSameTask(getActivity())
為什么說NavUtils+元數據更好呢?
1.將描述Activity之間關系的語句由java轉為了xml配置
2.保證了fragment的獨立性
另外補充一點知識:在如何獲取activity的父級activity時,前面講的是使用NavUtils的getParentActivityName()方法,該方法本質上是NavUtils獲取Activity的meta-data,看看有沒有
叫"android.support.PARENT_ACTIVITY"的,有就獲取它的值。
但我們也可以通過普適性的方法,獲取meta-data的信息,這樣就可以不用非將acitivy的name設為android.support.PARENT_ACTIVITY了
因為所有的meta-data最終都是以bundle的形式保存在PackageManager中,因此代碼如下
此外,需要說明的是,操作欄是API11級以后出現,因此需要兼容。而選項菜單並不是API11級以后出現的。