1. 程式人生 > >Android 使用者介面---操作欄(Action Bar 二)

Android 使用者介面---操作欄(Action Bar 二)

選擇操作項

通過評估一些關鍵的特性,你應該仔細的選擇選項選單中的那些選單項應該作為操作項來顯示,通常,每個操作項應該至少滿足下列特性之一:

1.  經常使用:使用者百分之七十以上的訪問都需要使用的操作,或者是要連續的多次使用的操作。

2.  重要:它是一個使用者能夠很容易找到的操作,即使它不是經常性的操作,也需要使用者在需要的時候能夠輕易的找到它,並執行。

如,Wi-Fi設定中的新增網路等。

3.  典型:它是一些類似應用程式的操作欄中提供的典型操作,因此,使用者都期望在操作欄中能夠找到它。

如,電子郵件或社交應用程式中的“重新整理”操作。

如果你想要把四個以上的選單項調整為操作項,那麼你就應該認真考慮一下他們相對的重要性級別,並且嘗試不要超過四個以上的操作項設定(並且還有使用“ifRoom”屬性值的設定,允許系統在遇到空間受限的比較小的螢幕的時候,能夠把靠後的操作項放到溢位選單中)。即使在一些寬屏裝置上,空間充足,你也不應該建立很多操作項,這樣會擾亂UI的佈局,而且更像一個桌面工具欄,因此要保持最小數量的操作項。

另外,以下操作應該永遠不要作為操作項來顯示:設定、幫助、意見反饋、或類似的操作。要把它們始終保留在溢位選單中。

注意:不是所有的裝置都給檢索提供了專有的硬體按鈕,因此,如果是你應用程式中的一個重要功能,它應該始終作為一個操作項來顯示(而且通常要把放到第一項的位置,尤其是操作視窗中提供這個操作的時候)。

使用分離式操作欄

當你的應用程式正在Android4.0(API 級別 14)或以上的版本上執行,那麼還有一種叫做“分隔操作欄”的額外模式對操作欄有效。當你啟用分隔操作欄模式時,在螢幕的底部會顯示一個獨立的橫條,用於顯示Activity在窄屏裝置(如豎屏手機)上執行時的所有操作項。

把操作欄分隔成獨立的操作項,確保在窄屏裝置上有合適的空間來顯示所有的操作項,同時把導航條和標題元素留在頂部。

要啟用分離式操作欄,只需簡單的在<application>或<activity>元素中新增uiOptions=”splitActionBarWhenNarrow”屬性設定就可以了。

要注意,Android會基於當前螢幕的尺寸用各種方式來調整操作欄的外觀。使用分離式操作欄只是你能夠啟用的允許操作欄針對不同螢幕尺寸來進一步優化使用者體驗的選項之一。你還可以允許操作欄把導航選項標籤摺疊到主操作欄中,如果你在操作欄中使用導航選項標籤,那麼一旦操作項在窄屏裝置上被分離,這些導航選項標籤就可能填充到主操作欄中,而不是被分離到堆疊起來的操作欄。尤其是如果你禁用了操作欄的圖示和標題(用setDisplayShowHomeEnabled(false)和setDisplayShowTitleEnabled(false)方法),那麼導航選項標籤就會摺疊到主操作欄中,如下圖3中第二個裝置的顯示:

pic

圖3. 左側是帶有導航選項標籤的分離式操作欄,右側是禁用了應用圖示和標題的分離式操作欄。

注意:儘管android:uiOptions屬性在Android4.0(API 級別 14)中才被新增,但是為了保持跟Android的低版本的相容性,即使你的minSdkVersion屬性值小於14,那麼你的應用程式也可以安全的包含android:uiOptions屬性。在舊版本上執行時,因為系統不能理解這個屬性,所以只是簡單的忽略了這個XML屬性。在你的清單檔案中包含這個屬性的唯一條件是,你必須在支援API級別14或更高以上版本的平臺上編譯你的應用程式。為了保持相容性,你不能在你的應用程式程式碼中使用由minSdkVersion屬性宣告的版本所不支援的API,只有XML屬性才能被舊的平臺版本安全的忽略。

使用應用程式圖示來導航

預設情況下,應用程式圖示顯示在操作欄的左邊。你能夠把這個圖示當做操作項來使用。應用程式應該在這個圖示上響應以下兩個操作之一:

1.  返回應用程式的“主”Activity;

2.  嚮應用程式上級頁面導航。

當用戶觸控這個圖示時,系統會呼叫Activity帶有android.R.id.home ID的onOptionsItemSelected()方法。在這個響應中,你既可以啟動主Activity,也可以返回你的應用程式結構化層次中使用者上一步操作的介面。

如果你要通過應用程式圖示的響應來返回主Activity,那麼就應該在Itent物件中包括FLAG_ACTIVITY_CLEAR_TOP標識。用這個標記,如果你要啟動的Activity在當前任務中已經存在,那麼,堆疊中這個Activity之上的所有的Activity都有被銷燬,並且把這個Activity顯示給使用者。新增這個標識往往是重要的,因為返回主Activity相當與一個回退的動作,因此通常不應該再建立一個新的主Activity的例項,否則,最終可能會在當前任務中產生一個很長的擁有多個主Activity的堆疊。

例如,下例的onOptionsItemSelected()方法實現了返回應用程式的主Activity的操作:

@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);
    }
}

在使用者從另一個應用程式進入當前Activity的情況下,你可能還想要新增FLAG_ACTIVITY_NEW_TASK標識。這個標識確保在使用者返回主頁或上級頁面時,新的Activity不會被新增到當前的任務中,而是在屬於你自己的應用程式的任務中啟動。例如,如果使用者通過被另一個應用程式呼叫的Intent物件啟動了你的應用程式中的一個Activity,那麼選擇操作欄圖示來返回主頁或上級頁面時,FLAG_ACTIVITY_CLEAR_TOP標識會在屬於你的應用程式的任務中啟動這個Activity(不是當前任務)。系統既可以用這個新的Activity做根Activity來啟動一個新的任務,也可以把存在後臺的擁有這個Activity例項的一個既存任務帶到前臺來,並且目標Activity會接受onNewIntent()回撥。因此,如果你的Activity要接收另一個應用程式的Intent物件,那麼通常應該給這個Intent物件新增FLAG_ACTIVITY_NEW_TASK標識,如:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

注意:如果你要使用應用圖示來返回主頁,要注意從Android4.0(API 級別 14)開始,必須通過呼叫setHomeButtonEnabled(true)方法確保這個圖示能夠作為一個操作項(在以前的版本,預設情況下,這個圖示就能夠作為一個操作項)。

嚮應用程式上級頁面導航

作為傳統的回退導航(把使用者帶回任務歷史中的前一個視窗)的補充,你能夠讓操作欄圖示提供向上級頁面導航的功能,它應用把使用者帶回到你的應用程式的上級頁面。例如,當前頁面時你的應用程式層次比較深的一個頁面,觸控應用程式圖示應該返回返回上一級頁面(當前頁面的父頁面)。

pic

圖4. Email應用程式的標準圖示(左)和向上導航圖示(右)。系統會自動新增向上指示。

例如,圖5演示了當使用者從一個應用程式導航到一個屬於不同應用程式的Activity時,“回退”按鈕的行為。

pic

圖5. 在從People(或Contacts)應用程式進入Email應用程式之後,回退按鈕的行為。

但是,如果在編輯完郵件之後,想要停留在Email應用程式中,那麼向上導航就允許你把使用者導航到Email應用程式中編輯郵件頁面的上級頁面,而不是返回到前一個Activity。圖6演示了這種場景,在這個場景中,使用者進入到Email應用程式後,不是按回退按鈕,而是按操作欄圖示來向上導航。

pic

圖6. 從People應用進入Email應用後,向上導航的行為。

要是應用程式圖示能夠向上導航,就要在你的ActionBar中呼叫SetDisplayHomeAsUpEnabledtrue(true)方法。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    ...
}

當用戶觸控這個圖示時,系統會呼叫帶有android.R.id.home ID的onOptionsItemSelected()方法。

請記住要在Intent物件中使用FLAG_ACTIVITY_CLEAR_TOP標識,以便你不會這個父Activity存在的情況下,再建立一個新的例項。例如,如果你不使用FLAG_ACTIVITY_CLEAR_TOP標識,那麼向上導航後,再按回退按鈕,實際上會把使用者帶到應用程式的下級頁面,這是很奇怪的。

注意:如果有很多使用者能夠到達應用程式中當前Activity的路徑,那麼,向上圖示應該沿著當前Activity的實際啟動路徑逐步的向會導航。