Android 使用者介面—操作欄(Action Bar 一)

來源:互聯網
上載者:User

操作欄是一個標識應用程式和使用者位置的視窗功能,並且給使用者提供操作和導航模式。在大多數的需要突出展現使用者操作或全域導航的Activity中,你應該使用操作欄,因為操作欄能夠跨應用程式給使用者提供一致的介面,並且系統能夠很好根據不同的螢幕配置來適應操作欄的外觀。你能夠用ActionBar的對象的API來控制操作欄的行為和可見度,這些API被添加在Android3.0(API 層級 11)中。

操作欄的主要目的是:

1.  為了標識應用程式的商標和使用者的位置而提供的一個專用空間。

這個空間的左邊是應用的表徵圖或logo,以及Activity的標題。但是,如果是像當前選擇的標籤這樣的標識當前View對象的導航標籤,你可以選擇刪除Activity的標題。

2.  在不同的應用程式之間提供一致的導航和視覺體驗。

操作欄提供了用於Fragment間切換的內建導航標籤。它還提供了一個用於替換導航模式或最佳化當前視覺效果(如按照不同條件排序的列表)的下拉式清單。

3.  突出Activity的關鍵操作(如“搜尋”、“建立”、“共用”,等),並且在可預見的方法內給使用者提供快捷的訪問。

對於關鍵的使用者操作,你能夠通過把選項功能表項目作為操作項直接放到操作欄中,從而提供快捷的訪問。操作項目還能提供一個操作視窗,這個視窗給更直接的操作行為提供一個嵌入的視窗組件。沒有改進成操作項的功能表項目在溢出菜單中還是有效,使用者既可以使用裝置上的功能表按鈕(裝置上有按鈕的時候),也可以使用操作欄中的溢出功能表按鈕(當裝置上不包含功能表按鈕時)來顯示這些操作項目。

 

圖1. Honeycomb Gallery應用中的操作欄,從左邊開始,依次是logo、導航選項標籤和操作項(在右邊插入的一個溢出功能表按鈕)。

 注意:如果你在尋找有關上下文操作欄的資訊,請看“菜單”指南。

添加操作欄

從Android3.0(API層級 11)開始,操作欄被包含在所有的使用Theme.Hole主題的Activity(或者是這些Activity的子類)中,當targetSdkVersion或minSdkVersion屬性被設定為“11”或更大的數值是,這個主題是預設的主題一。如:

<manifest ... >
    <uses-sdk android:minSdkVersion="4"
              android:targetSdkVersion="11" />
    ...
</manifest>

在這個例子中,應用程式要求最小的API版本層級是4(Android 1.6),但是它還要求了目標API版本層級是11(Android 3.0)。這樣,當應用程式運行在Android3.0或更高的版本上時,系統就會給每個Activity應用全景主題,這樣,每個Activity就會包含操作欄。

如果你想使用ActionBar API來進行添加導航模式和修改操作欄樣式的操作,你應該把minSdkVersion屬性設定為“11”或更大的值。如果想要你的應用程式支援更舊的Android版本,那麼在支援API 層級 11或更高版本,但卻依然運行著舊的Android版本的裝置上,就要使用受限受限droid如果你運行咋是預設的主題一、。在溢出菜單中是有效的ActionBar API集。

刪除操作欄

對於特殊的Activity,如果你不想要操作欄,把Activity的主題設定為Theme.Holo.NoActionBar就可以了,如:

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

你也能夠通過調用hide()方法在運行時隱藏操作欄,如:

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

當操作欄隱藏時,系統會調整你的Activity來填充當前有效螢幕空間。你能夠使用show()方法來再次顯示操作欄。

在隱藏和刪除操作欄時,要當心為了適應被操作欄佔用的空間而導致的Activity的重新布局。如果你的Activity有規律的隱藏和顯示操作欄,你可能想要使用覆蓋模式。覆蓋模式在Activity的頂部描畫操作欄,而不是在它們所擁有的螢幕的地區。這樣,在操作欄隱藏和重新顯示時,你的布局保持不變。要使用覆蓋模式,就要給Activity建立一個主題,並且把android:windowActionBarOverlay屬性設定為true。

提示:如果你有一個刪除了操作欄的定製化的Activity主題,它把android:windowActionBar樣式屬性設定為false。但是,如果你使用了刪除操作欄的一個主題,那麼,建立視窗將不允許操作欄再顯示,因此,你不能在以後給這個Activity添加操作欄---因為getActionBar()方法將返回null。

添加操作項

有些時候,你可能想要讓使用者直接存取選項菜單中的一個項目,因此你要把應該在操作欄中顯示的功能表項目作為一個操作項來聲明。操作項能夠能夠包含一個表徵圖或文本標題。如果一個功能表項目不作為一個操作項顯示,那麼系統就會把它放到溢出菜單中。溢出菜單既可以通過裝置的Menu按鈕來顯示,也可以操作欄中一個額外的按鈕來顯示。

當Activity初次開機時,系統會調用onCreateOptionsMenu()方法給你的Activity組裝操作欄和溢出菜單。在這個回調方法中應該載入在XML檔案中定義的功能表項目資源,如:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_activity, menu);
    return true;

}

圖2. 帶有表徵圖和文本標題的兩個操作項,和溢出功能表按鈕。

在XML檔案中,你能夠通過給<item>元素宣告android:showAsAction=”ifRoom”s屬性,請求把一個功能表項目作為一個操作項來顯示。用這種方式,只在有有效空間時,功能表項目才能顯示在操作欄中。如果沒有足夠的空間,這個功能表項目會顯示在溢出菜單中。

如果你的功能表項目支援標題和表徵圖---帶有android:title和android:icon屬性---那麼預設情況下,操作項僅顯示表徵圖。如果你要顯示文本標題,就要給android:showAsAction屬性添加withText設定,如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_save"
          android:icon="@drawable/ic_menu_save"
          android:title="@string/menu_save"
          android:showAsAction="ifRoom|withText" />
</menu>

注意:withText值示意操作欄要顯示文本標題。操作欄會儘可能的顯示這個標題,但是,如果表徵圖有效並且受到操作欄空間的限制,文本標題有可能顯示不全。

當使用者選擇了一個操作項時,Activity會接收一個onOptionsItemSelected()的回調,要把android:id屬性支援的ID傳遞給這個方法。

給每個功能表項目定義android:title屬性是至關重要的,即使你沒有給操作項聲明標題。原因如下:

1.  如果操作欄中沒有足夠的空間來顯示操作項,那麼功能表項目就會顯示在溢出菜單中,並僅顯示標題;

2.  螢幕助讀程式要給視障使用者朗讀功能表項目標題;

3.  如果僅用表徵圖來顯示操作項,那麼,使用者能夠長按這個項目,用操作項的標題來顯示提示資訊。

注意:如果你添加源於Fragment對象的功能表項目,那麼通過Fragment類的onCreateOptionsMenu回調方法,當使用者選擇其中一個Fragment功能表項目時,系統會對用那個Fragment對象對應的onOptionsItemSelected()方法。但是,Activity有機會首先處理這個事件,因為系統在調用對應的Fragment對象的onOptionsItemSelected()方法之前會調用Activity的相同的回調方法。

你也能夠聲明一個功能表項目,讓它始終作為操作項來顯示,而不是在空間不足時就放到溢出菜單中。大多數情況下,你不應該使用always屬性值來強制一個功能表項目始終顯示在操作欄中,但是,當提供了一個不給溢出菜單提供預設操作的操作視窗時,你就需要始終顯示一個功能表項目。但是要警惕,太多的操作項會建立一個混亂的UI,並且會導致窄屏裝置上的布局問題。最好的方法是使用ifRoom屬性值,它允許系統在操作欄空間不足的時候,把功能表項目移到溢出菜單中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.