1. 程式人生 > >android 動作欄(Action Bar)

android 動作欄(Action Bar)

Action Bar是活動中的一種控制元件,用以代替傳統的螢幕頂端的標題欄。預設,Action Bar包括了左側的應用程式圖示(logo),其右是活動的標題,以及Option Menu中的可選專案。Action Bar提供了多種便利特性,包括:

  • 直接在Action Bar中顯示Option Menu中的專案,稱之為“動作專案(action item)”——以提供對於關鍵使用者操作的快速選擇。沒有作為動作專案顯示的選單專案則位在浮動式選單中,通過Action Bar的下拉列表顯示。

  • 提供在不同片段之間的導航標籤。

  • 提供導航用的下拉列表。

  • 提供互動式的“動作檢視(action view)”以代替動作專案(例如搜尋框)。

圖1. Email應用程式中Action Bar的一個截圖,包含了編寫新郵件和重新整理收件箱的動作專案。

新增Action Bar

Action Bar在Android 3.0及以上的活動中是預設被包含的。更為具體地說,所有使用了新的“holographic”主題的活動將包含Action Bar,而任何以Android 3.0為目標平臺的應用程式將自動使用該主題。當一個應用程式在<uses-sdk>元素中設定了android:minSdkVersionandroid:targetSdkVersion屬性為“11”或更高時,被認為是以Android 3.0為目標平臺的。例如:

1 2 3 4 5 6 7 8 9 10 package="com.example.helloworld" android:versionCode="1" android:versionName="1.0" <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="11" />  <application ... >  ...  </application>  </manifest>

在本範例中,程式請求了最小API等級為4(Android 1.6),而目標API等級為11(Android 3.0)。這樣,當程式安裝於執行Android 3.0或是更高版本的裝置上時,系統將為每一個活動提供holographic主題,因而每個活動都將包含Action Bar。

不過,如果希望使用Action Bar的API,例如新增標籤或是修改Action Bar風格,就需要將android:minSdkVersion設為“11”,這樣才能使用ActionBar類。

移除Action Bar

如果希望從某個指定的活動中移除Action Bar,只需將該活動的主題設為Theme.Holo.NoActionBar。例如:

1 <activity android:theme="@android:style/Theme.Holo.NoActionBar">

提示:如果希望從一個自定義的主題中移除Action Bar,只需將android:windowActionBar樣式屬性設為false。關於更多Action Bar樣式的內容請參見“對Action Bar使用樣式”。

還可以在執行時通過呼叫hide()來隱藏Action Bar,之後通過呼叫show()來再次顯示它。例如:

1 2 ActionBar actionBar = getActionBar();  actionBar.hide();

當Action Bar隱藏時,系統將調整活動的內容來填充可用的螢幕空間。

注意:如果移除了使用主題的Action Bar,那麼該視窗將完全禁用Action Bar而無法再在執行時新增——呼叫getActionBar()將返回null。

新增動作專案

動作專案僅僅是Option Menu中被宣告要直接顯示在Action Bar上的選單專案。一個動作專案可以包括一個圖示和/或文字。如果一個選單專案不是動作專案,那麼系統將把它放在浮動式選單中,使用者可以通過選擇Action Bar右側的選單圖示開啟浮動式選單。

當活動啟動時,系統將通過呼叫onCreateOptionMenu()來為活動生成Action Bar和浮動式選單。如同在“選單”開發者指南中所描述的,這是為活動定義Option Menu的回饋方法。

可以指定某一選單專案作為動作專案顯示——如果有這樣的空間的話——通過在選單資源中為<item>元素宣告android:showAsAction=”ifRoom”。這樣,該選單專案僅會在空間足夠時顯示在Action Bar中以供快速選擇。如果空間不足,該專案將被置於浮動式選單中(通過Action Bar右側的選單圖示開啟)。

可以在應用程式程式碼中宣告一個選單專案為動作專案,只需對MenuItem呼叫setShowAsAction()並傳遞SHOW_AS_ACTION_IF_ROOM。

如果選單專案同時提供了標題和圖示,那麼動作專案預設只顯示圖示。如果希望讓動作專案包含文字,需要在XML中新增”with text”旗標、對android:showAsAction屬性新增withText,或是在程式程式碼中呼叫setShowAsAction()並使用SHOW_AS_ACTION_WITH_TEXT旗標。圖2展示了有兩個帶有文字的動作專案以及浮動式選單圖示的Action Bar。

圖2. 有兩個動作專案以及浮動式選單圖示的Action Bar的螢幕截圖。

下面是一個在選單資原始檔中將選單專案宣告為動作專案的一個範例:

1 2 3 4 5 6 7 <?xml version="1.0" encoding="utf-8"?>  <item android:id="@+id/menu_save" android:icon="@drawable/ic_menu_save" android:title="@string/menu_save" android:showAsAction="ifRoom|withText" />  </menu>

在這時,ifRoomwithText旗標都被設定了,所以當這個專案作為動作專案顯示時,它包含了圖示以及標題文字。

Action Bar中的選單專案和Option Menu中的其他專案都會啟發相同的回饋方法。當用戶選擇了一個動作專案時,活動將收到一個onOptionsItemSelected()的呼叫,並傳遞專案ID。

注意:如果用片段中新增選單專案,那麼該片段相應的onOptionsItemSelected()方法將被呼叫。然而活動可以在此之前先對其進行處理,也就是說系統對活動的onOptionsItemSelected()呼叫要先於對片段的。

可以宣告一個專案總是作為動作專案出現,不過這並不被推薦,因為這會在有太多的動作專案時讓UI變得混亂,Action Bar中的動作專案將會專案重疊。

關於選單的更多資訊,請參見“選單”開發者指南。

將應用圖示用作選單專案

應用程式圖示默認出現在Action Bar的左側。它也將響應使用者互動操作(當用戶點選它時,它會有和其他動作專案一樣的視覺響應),但需要手動指定使用者點選時的行為。

圖 3. Email的Action Bar,左側有應用程式圖示。

通常的行為應當是在使用者單擊圖示時讓應用程式回到“主活動”或是(比如,在活動沒有發生變化而片段變化了的時候)回到初始狀態。如果使用者已經處於主活動或是初始狀態,則不必進行任何處理。

當用戶單擊圖示時,系統以android.R.id.home的ID呼叫該活動的onOptionsItemSelected()方法。因此,需要在onOptionsItemSelected()方法中新增一個條件判斷來偵聽android.R.id.home並執行正確的行為,例如啟動主活動或是將最近的片段事務出棧。

如果通過返回主活動來響應應用圖示的點選,那麼需要在Intent內包含FLAG_ACTIVITY_CLEAR_TOP旗標。這樣,如果要啟動的活動已經存在於當前任務的話,所有在其上的活動將被銷燬,該活動將回到最上層。這種方式是令人滿意的,因為回到“主活動”和“返回”是等價的,不應該為主活動建立新的例項。否則,最終在當前任務中會有一個很長的活動棧。

例如,下面是一個onOptionsItemSelected()的實現,它將返回應用程式的“主活動”:

1 2 3 4 5 6 7 8 9 10 11 12 13 @Override  public boolean onOptionsItemSelected(MenuItem item) {  switch (item.getItemId()) {  case android.R.id.home:  // app icon in Action Bar clicked; go home  Intent intent = new Intent(this, HomeActivity.class);  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  startActivity(intent);  return true default return super.onOptionsItemSelected(item);  }

使用應用圖示來進行”向上一級“導航

還可以使用應用程式的圖示來為使用者提供“向上一級”的導航。這在程式中的活動總是以某種固定的順序出現並期望使用者能方便地返回上一級活動的情況下特別有用(不過無所謂使用者是怎樣進入當前的活動的)。

響應這一事件的方式和返回主活動的方式是相同的(和上文所說的類似,只不過現在是根據當前的活動是哪一個來啟動另一個不同的活動)。為了告訴使用者這時的情況將有所不同,唯一需要做的就是把Action Bar設為“show home as up”。這通過對活動的ActionBar呼叫setDisplayHomeAsUpEnabled(true)即可完成。這時,系統將為應用程式的圖示增加一個表示向上一層動作的箭頭,就像圖4這樣。

圖 4. Email應用的標準圖示(上)和“向上一層”圖示(下)。

例如,下面是將應用圖標表示為“向上一層”動作的方法:

1 2 3 4 5 6 @Override  protected void onStart() {  super.onStart();  ActionBar actionBar = this.getActionBar();  actionBar.setDisplayHomeAsUpEnabled(true);  }

之後,活動應當在使用者單擊圖示時進行響應,在onOptionsItemSelected()中,通過監聽ID android.R.id.home(如上所示)。在這種情況下,當向上導航時,在Intent中使用FLAG_ACTIVITY_CLEAR_TOP旗標是更為重要的,這樣才能不在上級活動的例項已經存在時還再次建立一個新的。

新增一個動作檢視(Action View)

動作檢視是在Action Bar上出現的一個控制元件,作為動作專案的一種替代。例如,如果在Option Menu中有一個專案是“搜尋”,那麼當該專案作為動作專案使用時可以在Action Bar中為該專案新增一個提供SearchView控制元件的專案。

當為一個選單專案新增動作檢視時,允許該專案在沒有出現於Action Bar時仍能作為一個通常的選單專案執行指令是很重要的。例如,一個執行搜尋工作的選單專案應該預設彈出Android搜尋對話方塊,但如果該專案被置於Action Bar的話,動作檢視將以SearchView控制元件的形式顯示。圖4展示了一個動作檢視的SearchView控制元件的範例。

圖4. 帶有一個SearchView控制元件的動作檢視。

為一個專案宣告動作檢視最好的方式是在選單資源中使用android:actionLayout或是android:actionViewClass屬性:

android:actionLayout的值必須是指向一個佈局檔案的資源指標。例如:

1 2 3 4 5 6 7 8 <?xml version="1.0" encoding="utf-8"?>  <item android:id="@+id/menu_search" android:title="Search" android:icon="@drawable/ic_menu_search" android:showAsAction="ifRoom" android:actionLayout="@layout/searchview" />  </menu>

android:actionViewClass的值必須是一個所要使用的View的完整類名。例如:

1 2 3 4 5 6 7 8 <?xml version="1.0" encoding="utf-8"?>  <item android:id="@+id/menu_search" android:title="Search" android:icon="@drawable/ic_menu_search" android:showAsAction="ifRoom" android:actionViewClass="android.widget.SearchView" />  </menu>

必須包含android:showAsAction=”ifRoom”以使專案在空間足夠時作為動作檢視顯示。不過,在必要時,可以通過設定android:showAsAction“always”來強制該專案以動作檢視顯示。

現在,當選單專案作為一個動作專案顯示時,它將是一個動作檢視而不是圖示和/或標題文字。不過,如果在Action Bar中沒有足夠的空間的話,該專案將在浮動式選單中以一個通常選單專案的形式顯示,必須在onOptionsItemSelected()回饋方法中響應該專案。

當活動首次啟動時,系統通過呼叫onCreateOptionsMenu()生成Action Bar和浮動式選單。當選單在該方法中被展開之後,可以通過以選單專案的ID呼叫findItem()來獲取動作檢視的元素(比如為了繫結監聽器),而後對所返回的MenuItem呼叫getActionView()。例如,上面的例子裡的搜尋控制元件可以像這樣獲得:

1 2 3 4 5 6 7 8 @Override  public boolean onCreateOptionsMenu(Menu menu) {  getMenuInflater().inflate(R.menu.options, menu);  SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();  // Set appropriate listeners for searchView  ...  return super.onCreateOptionsMenu(menu);  }

關於使用搜索控制元件的更多資訊,請參見“建立一個搜尋介面”。

新增標籤(tab)

動作欄可以顯示標籤以使使用者在活動內的不同片段之間導航。每一個標籤可以包含一個標題和/或一個圖示。

圖 6. 在Honeycomb版本的相簿範例程式中的Action Bar中的標籤的截圖。

首先,佈局必須在每一個和顯示的表現相關聯的Fragment中包含一個View。要確保該檢視有一個能在程式碼中引用的ID。

要新增標籤至Action Bar:

1. 建立一個ActionBar.TabListener的實現來處理Action Bar標籤的互動事件。比如實現所有的方法:onTabSelected()、onTabUnselected()和onTabReselected()。

每一個回饋方法都將傳遞收到了事件的ActionBar.Tab和一個FragmentTransaction用以執行片段事務(新增或是移除片段)。

例如:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 private class MyTabListener implements ActionBar.TabListener {  private TabContentFragment mFragment;  // Called to create an instance of the listener when adding a new tab  public MyTabListener(TabContentFragment fragment) {  mFragment = fragment;  public void onTabSelected(Tab tab, FragmentTransaction ft) {  ft.add(R.id.fragment_content, mFragment, null);  public void onTabUnselected(Tab tab, FragmentTransaction ft) {  ft.remove(mFragment);  public void onTabReselected(Tab tab, FragmentTransaction ft) {  // do nothing  }

這種ActionBar.TabListener的實現添加了一個儲存與標籤關聯的Fragment的建構函式以使每一個回饋函式可以新增或是移除片段。

2. 在onCreate()時通過在Activity中呼叫getActionBar()來獲取活動的ActionBar(不過要注意需要在呼叫了setContentView()之後才這麼做)。

3. 呼叫setNavigationMode(NAVIGATION_MODE_TABS)來開啟ActionBar的標籤模式。

4. 為Action Bar建立所有的標籤:

1. 通過對ActionBar呼叫newTab()來建立新的ActionBar.Tab。

2. 通過呼叫setText()和/或setIcon()來為標籤新增文字和/或圖示。

提示:這些方法返回相同的ActionBar.Tab例項,所以可以將這些呼叫一起使用。

3. 宣告ActionBar.TabListener,並通過向setTabListener()傳遞其實現的一個例項來使用它。

5. 通過對ActionBar呼叫addTab()來新增所有的ActionBar.Tab,並傳遞它們。

例如,下面的程式碼結合了步驟2-5來建立了兩個標籤並將它們新增至了Action Bar:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  // setup Action Bar for tabs  final ActionBar actionBar = getActionBar();  actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  // remove the activity title to make space for tabs  actionBar.setDisplayShowTitleEnabled(false);  // instantiate fragment for the tab  Fragment artistsFragment = new ArtistsFragment();  // add a new tab and set its title text and tab listener  actionBar.addTab(actionBar.newTab().setText(R.string.tab_artists)  .setTabListener(new TabListener(artistsFragment)));  Fragment albumsFragment = new AlbumsFragment();  actionBar.addTab(actionBar.newTab().setText(R.string.tab_albums)  .setTabListener(new TabListener(albumsFragment)));  }

標籤被選中時所有需要進行的行為都必須在ActionBar.TabListener回饋方法中被定義。當一個標籤被選中,它將收到一個onTabSelected()的呼叫,應當在這裡通過使用add()及所提供的FragmentTransaction來向佈局中指定的檢視新增正確的片段。類似的,當一個標籤被取消選中時(因為另一個標籤被選中了),則應當使用remove()來從佈局中移除該片段。

注意:不能為這些事務呼叫commit()——系統會呼叫它,如果手動呼叫的話將會丟擲一個例外。同時也不能將這些片段事務新增至返回棧。

如果活動被中止,應當儲存當前選中的標籤,這樣當用戶返回應用程式時,可以開啟該儲存的標籤。在儲存狀態時,可以通過getSelectedNavigationIndex()獲取當前選中的標籤。這將返回所選標籤的索引位置。

注意:應該在必要時儲存每一個片段的狀態,這樣使用者在切換標籤並返回前一個片段時能保持之前的樣子。關於儲存片段狀態的更過資訊,請參見“片段”開發者指南。

相關推薦

android 動作Action Bar

Action Bar是活動中的一種控制元件,用以代替傳統的螢幕頂端的標題欄。預設,Action Bar包括了左側的應用程式圖示(logo),其右是活動的標題,以及Option Menu中的可選專案。Action Bar提供了多種便利特性,包括: 直接在Action Bar中顯示Option Menu中的專

Training--新增動作Action Bar

新增動作欄(ActionBar) 動作欄是最重要的設計元素之一,提供給你的app的activity使用。它具備幾個UI相關的特點,可以保證使用者在使用你的app時,擁有體驗的一致性。主要功能包括: 有一個專門的地方標誌你的APP,同時顯示使用者在APP中當前的位置。 以一

安卓開發入門:工具Action Bar

本文針對Android3.0及以上。主要是官方文件的翻譯加上我自己的理解。對應於官方文件的develop -- Training -- Adding the Action Bar 內容: 1.新增工具欄 2.新增工具欄按鈕     2.1 工具欄佈局     2.2新增工

Android 使用者介面---操作Action Bar

選擇操作項 通過評估一些關鍵的特性,你應該仔細的選擇選項選單中的那些選單項應該作為操作項來顯示,通常,每個操作項應該至少滿足下列特性之一: 1.  經常使用:使用者百分之七十以上的訪問都需要使用的操作,或者是要連續的多次使用的操作。 2.  重要:它是一個使用者能夠很容易找

Android隱藏系統底部工具Navigation bar

為適配無實體鍵機型,Android系統預設自帶底部虛擬按鍵工具欄。由於專案需求,需要隱藏底部工具欄,網上推薦更改base/core/res/res/values/dimens.xml中<dimen name="navigation_bar_height">0dp&

IQKeyboardManager 狀態status bar問題

shared hack inset control gin begin available ear 說明 因為懶,所以具體什麽樣子,參考下面的鏈接 具體的問題情況參考:StatusBar background problem #1158 我解決的思路很簡單,就是在監

Android 標題1

本文來自網易雲社群作者:孫有軍標題欄在每個應用中都有,有各種各樣的標題欄,今天我們就主要來說說標題欄怎麼做,主要內容涉及到自定義標題,ActionBar,Toolbar等知識。自定義標題幾年前開發安卓是沒有統一的標題的,每一個頁面都需要自己來佈局標題,如果有多個頁面標題類似,

xamarin的android去掉Activity的NameTitle bar

在Activity的Oncreate方法中加入     RequestWindowFeature(WindowFeatures.NoTitle);   , 在SetContentView之前。      pu

android 開發 -- NavigationView和DrawerLayout實現 側滑Material Design

隨著 Google I/O 2015,新的 Android Design Support Library給開發者帶來了一些重要的 Material Design 元件,並且向下相容到 Android 2.1, NavigationView 就是其中之一,可用於方便地建立導航抽

Android 標題

       在前一篇文章Android標題欄(一)中我們已經講解了一些屬性,接下來我們繼續講解剩下的屬性。 ActionBar & Toolbar 設定ActionView        我們可以在選單中設定ActionView,比如搜尋

Pro Android學習筆記一三七:Home Screen Widgets3:配置Activity

map onclick widgets info xtra ces extends height appwidget 文章轉載僅僅能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處http://blog.csdn.net/flowingfly

Android 屬性動畫Property Animation 全然解析

顏色 valid 全部 加速度 ext target ng- 點擊 save 轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/380674751、概述Android提供了幾種動畫類型:View Anima

在彈框中獲取foreach中遍歷的id值,並傳遞給地址方法2

ges 應該 我們 png 地址欄 each 獲取 賦值 有時 1.php有時候我們需要再彈框中獲取foreach中遍歷的數據(例如id),在彈框中點擊按鈕並傳遞給地址欄跳轉。那麽應該怎麽做呢。第二種方法。 2. 可以在彈框中給出一個input hidden 點擊按鈕彈窗時

Android學習路線十二Activity生命周期——啟動一個Activity

-c out 方式 下載地址 生命 後臺線程 ring lan debug DEMO下載地址:http://download.csdn.net/detail/sweetvvck/7728735 不像其他的編程模式那樣應用是通過main()函數啟動的。Android系

Android雙向seekbar帶刻度

track progress 效果 ide text break dsm blog data- ※效果 ※使用方法 seekBarPressures.setOnSeekBarChangeListener(new SeekBarPres

Android開發系列十七:讀取assets文件夾下的數據庫文件

pack 取數 code ada tracking 編寫 數據庫 sdn where 在做Android應用的時候,不可避免要用到數據庫。可是當我們把應用的apk部署到真機上的時候,已經創建好的數據庫及其裏邊的數據是不能隨著apk一起安裝到真機上的。 (PS:這篇

Android定位測試深坑

pos img 方法 電信 馬來西亞 我們 其他 應用 移動 問題:我們是一個海外app,市場部去馬來西亞打開那邊的市場,發現了一個問題,就是我們的app定位有問題,還是成都的定位,主要原因是在馬來西亞使用這個app,請求中帶的經緯度參數是成都的,導致服務器返回了成都的定位

Framework7學習筆記之 搜索舊版

spa 結果 ... 視圖 nbsp str -i type bar 一:搜索欄 應用場景:一般用於在含有列表的頁面中進行內容檢索。 二:定義搜索欄 搜索欄應該放到“.page”內,“.page-content”前; 在page-conten

手動擼個Android雷達圖蜘蛛網圖RadarView

startx ech tro eset 部分 starty fill 中心 公司 公司產品需要一個雷達圖來展示各維度的比重,網上找了一波,學到不少,直接自己上手來擼一記 無圖言虛空 簡單分析一波,確定雷達圖正幾邊形的--正五邊形 int count=5,分為幾個層數--4

中英文切換導航最簡單

body ali fan center href pla 20px meta hover 使用ul li標簽構建導航欄,在li中設置兩個並列標簽<a>和<span>,分別裝有中文和英文,利用css:hover偽類設置顯示隱藏。 代碼如下: <