1. 程式人生 > >android ActionBar動作欄

android ActionBar動作欄

一、ActionBar:(動作欄)

(一)、簡介:(擴充套件TitleBar

        Action bar(動作欄)是一個導航控制元件,用以代替傳統螢幕頂端的標題欄。ActionBar顯示在螢幕頂部的控制元件,它包括了在左邊顯示的應用的logo圖示和右邊操作選單的可見項。類似於windows桌面程式的工具欄。

 

1、ActionBar主要功能:

        Action Bar被認為是新版Android系統中最重要的互動元素,在程式執行中一直置於頂部,主要起到的作用在於:

1)突出顯示一些重要操作(如“註冊”、“登入”、“搜尋”等)。將平時隱藏的選項選單顯示成活動項ActionItem。

2)在程式中保持統一的頁面導航和切換方式。這種基於Tab的導航方式,可以切換多個Fragment。

3)提供基於下拉的導航選單

4)使用程式logo,作為返回APP的HOME主頁面或向上的導航操作。

2、ActionBar分成四個區域:

  • App Icon:可顯示APP的icon,也可用其他圖示代替。當軟體不在最高階頁面時,圖示左側會顯示一個左箭頭,使用者可以通過這個箭頭向上導航。
  • 檢視切換:(效果如下圖)
  • Action Buttons:這個放最重要的軟體功能,放不下的按鈕就自動進入Action overflow了。
  • Action overflow:不常用的操作專案自動進入Action overflow

 

【備註:】什麼是Action overflow

        對於沒有MENU按鍵的手機,ActionBar會在最後顯示一個摺疊的圖示,點選該圖示會顯示剩餘的選項選單項。這個摺疊的圖示功能就是Action overflow。

        Action overflow中存放並不會頻繁用到的操作。按照官方網頁上的說法,“Overflow圖示僅顯示在沒有MENU硬按鍵的手機上,而對於有MENU鍵的手機,

overflow圖示是不顯示的,當用戶點選MENU按鍵時彈出。”  事實上Google已經敦促手機廠商及軟體開發商取消MENU選單。也就是以前的Menu將不再使用。

(二)、建立ActionBar:

1、XML資原始檔中定義menu。同樣可以有普通選單、二級普通選單、二級可選項選單。

<item
        android:id="@+id/menu_about"
        android:orderInCategory="2"
        android:showAsAction="never"    【注意:android:showAsAction的屬性值有:never、always、ifRoom、withText、collapseActionView
        android:title="關於"/>
 android:showAsAction屬性值的解釋:
  • never : 不將該MenuItem顯示在ActionBar上(是預設值)
  • always  : 總是將該MenuItem顯示在ActionBar上
  • ifRoom  : 當AcitonBar位置充裕時將該MenuItem顯示在ActionBar上
  • withText  : 將該MenuItem顯示在ActionBar上,並顯示該選單項的文字。但是隻在寬屏狀態下顯示。
  • collapseActionView  : 將該ActionView摺疊成普通選單項。最低API=14

多個屬性可以同時使用,使用“|”分隔

 

(三)、啟動程式圖示導航:(就是讓APP的LOGO也變成可以點選的導航圖示。)

核心程式碼如下:

                ActionBar actionBar = this.getActionBar();
                actionBar.setDisplayHomeAsUpEnabled(true);
                actionBar.setHomeButtonEnabled(true);
                actionBar.setDisplayShowHomeEnabled(true);
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                        Intent intent = new Intent(this, MainActivity.class);
                        //將Activity棧中處於MainActivity主頁面之上的Activity都彈出。
                       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(intent);
                        break;
                case R.id.action_search:
                        break;
                default:
                        return super.onOptionsItemSelected(item);
                }
                return true;
        }

程式碼解釋:

  1. actionBar = getActionBar();    獲取ActionBar物件。
  2. actionBar.setDisplayHomeAsUpEnabled(true);      設定是否將LOGO圖示轉成可點選的按鈕,並在圖示前新增一個向左的箭頭。
  3. actionBar.setHomeButtonEnabled(true);      設定是否將LOGO圖示轉變成可點選的按鈕。
  4. actionBar.setDisplayShowHomeEnabled(true);     設定是否顯示LOGO圖示。

(四)、ActionBar中新增Action View:

    1、Action的學習要掌握如何將選項選單顯示成Action Item;

    2、要掌握如何啟動程式Logo導航;

    3、ActionBar還可以新增Action View。

        呼叫方式1為:在xml檔案中寫上android:actionLayout="@layout/佈局名"。

        呼叫方式2為:在xml檔案中寫上android:actionViewClass="android.widget.SearchView"。

     4、示例程式碼:

核心程式碼如下:

 <item
        android:id="@+id/action_search"
        android:orderInCategory="1"
        android:showAsAction="always"
        android:title="搜尋"
        android:icon="@drawable/ic_launcher"
android:actionViewClass="android.widget.SearchView"  //兩種寫法任選其一android:actionLayout="@layout/search” 
        />

    <item
        android:id="@+id/action_clock"
        android:orderInCategory="2"
        android:showAsAction="always"
        android:title="時鐘"
        android:icon="@drawable/ic_launcher"
        android:actionLayout="@layout/clock"
        />
【備註:】以上兩個佈局檔案程式碼如下:
一、顯示搜尋的佈局檔案:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <SearchView
        android:id="@+id/search_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </SearchView>

</LinearLayout>
二、顯示時鐘的佈局檔案:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <AnalogClock
        android:id="@+id/analogClock_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

(五)、ActionBar在窗體底部顯示:

在清單配置檔案中設定android:uiOptions屬性為:splitActionBarWhenNarrow

可以在application或者activity節點中。

1、核心程式碼: <activity android:name="com.steven.android23.tab5_fragmentactionbartwo.MainActivity" android:label="@string/app_name" android:uiOptions="splitActionBarWhenNarrow">

(六)、ActionBar的導航模式

1、TAB標籤導航模式:

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TAB);

2、下拉列表導航模式:

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

(七)ActionBar保護現場

1、目的:當橫豎屏切換時,會讓頁面重新載入。在tab模式下,如何記住之前的tab索引呢?需要保護現場。

2、核心程式碼: @Override protectedvoid onSaveInstanceState(Bundle outState) { Log.i(TAG, "==index:" + getActionBar().getSelectedNavigationIndex()); outState.putInt("tabindex", getActionBar().getSelectedNavigationIndex()); } @Override protectedvoid onRestoreInstanceState(Bundle savedInstanceState) { getActionBar().setSelectedNavigationItem( savedInstanceState.getInt("tabindex")); }

(八)、橫豎屏切換時的生命週期問題的解決(android:configChanges屬性)

對android:configChanges屬性,一般認為有以下幾點:

1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次

3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

但是,自從Android 3.2(API 13),在設定Activity的android:configChanges="orientation|keyboardHidden"後,還是一樣 會重新呼叫各個生命週期的。因為screen size也開始跟著裝置的橫豎切換而改變。所以,在AndroidManifest.xml裡設定的MiniSdkVersion和 TargetSdkVersion屬性大於等於13的情況下,如果你想阻止程式在執行時重新載入Activity,除了設定"orientation", 你還必須設定"ScreenSize"。

解決方法:AndroidManifest.xml中設定android:configChanges="orientation|screenSize