Android軒轅劍之ActionBar之二

傳送門 ☞ 輪子的專欄 ☞ 轉載請註明 ☞ http://blog.csdn.net/leverage_1229

4使用應用程序圖標來導航

        默認情況下,應用程序圖標顯示在action bar的左邊。你能夠把這個圖標當做action item來使用。應用程序應該在這個圖標上響應以下兩個操作之一:
返回應用程序的“主”Activity,返回“home”界面;
嚮應用程序上層結構返回。
        當用戶觸摸這個圖標時,系統會調用Activity帶有android.R.id.home ID的onOptionsItemSelected()方法。在這個響應中,你既可以啓動home屏幕,也可以返回你的應用程序結構化層次中用戶上一步操作的界面。
        如果你要通過應用程序圖標的響應來返回home屏幕,那麼就應該在Intent對象中包含FLAG_ACTIVITY_CLEAR_TOP標識。用這個標誌,如果你要啓動的Activity在當前任務中已經存在,那麼,堆棧中這個Activity之上的所有的Activity都有被銷燬,並且把這個Activity顯示給用戶。添加這個標誌往往是重要的,因爲返回home屏幕相當與一個回退的動作,而不是創建。
        下面例子的onOptionsItemSelected()方法實現了返回應用程序的home屏幕的操作。
@Override

public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case android.R.id.home:

            // 在action bar點擊app icon; 回到 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標識。這個標識確保在用戶返回home或上級界面時,新的Activity不會被添加到當前的任務中,而是在屬於你自己的應用程序的任務中啓動。例如,如果用戶通過另一個應用程序調用的Intent對象啓動了你的應用程序中的一個Activity,那麼用戶選擇action bar圖標來返回home或上級界面時,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)方法確保這個圖標能夠作爲一個action item(在以前的版本,默認情況下,這個圖標就能夠作爲一個action item的)。

4.1應用程序向上導航

        作爲傳統的回退導航(把用戶帶回任務歷史中的前一個窗口)的補充,你能夠讓action bar圖標提供向上導航的功能,它應用把用戶帶回到你的應用程序的上級界面。例如,當前界面時你的應用程序層次比較深的一個界面,點擊應用程序圖標應該返回返回上一級頁面(當前界面的父界面)。
        當用戶從一個應用程序導航到一個屬於不同應用程序的Activity時,“回退”按鈕的行爲。
        但是,如果在編輯完郵件之後,想要停留在Email應用程序中,那麼向上導航就允許你把用戶導航到Email應用程序中編輯郵件頁面的上級界面,而不是返回到前一個Activity。
        要是應用程序圖標能夠向上導航,就要在你的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的實際啓動路徑逐步的向後導航。

5添加Action View

        Action View是作爲action item按鈕的替代品顯示在action bar中的一個widget。例如,如果你有一個用於搜索的可選菜單項,你可以用SearchView widget來替代action ba的搜索按鈕。
        要在菜單資源中的一個item聲明一個action view,你既可以使用android:actionLayout屬性也android:actionViewClass屬性來分別指定一個佈局資源或要使用的可視構件類。
<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/menu_search"

          android:title="@string/menu_search"

          android:icon="@drawable/ic_menu_search"

          android:showAsAction="ifRoom|collapseActionView"

          android:actionViewClass="android.widget.SearchView" />

</menu>
        android:showAsAction屬性也可包含“collapseActionView”屬性值,這個值是可選的,並且聲明瞭這個action view應該被摺疊到一個按鈕中,當用戶選擇這個按鈕時,這個action view展開。否則,這個action view在默認的情況下是可見的,並且即便在用戶不用的時候,也要佔據action bar的有效空間。如果需要給action view添加一些事件,那麼就需要在onCreateOptionsMenu()回調期間做點事。你能夠通過調用帶有菜單項ID的findItem()方法來獲取菜單項,然後再調用getActionView()獲取該元素。
@Override

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.options, menu);

    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();

    // 配置搜索信息並添加事件監聽器

    ...

    return super.onCreateOptionsMenu(menu);

}

5.1處理可摺疊的action views

        Action views讓你在不改變Activity或Fragment的情況下,就可以給用戶提供快捷的訪問和豐富的操作。但是,默認情況下讓action views可見可能不太合適。要保證action bar的空間(尤其是在小屏幕設備上運行時),你能夠把action view摺疊進一個action item按鈕中。當用戶選擇這個按鈕時,action view就在action bar中顯示。被摺疊的時候,如果你定義了android:showAsAction=“ifRoom”屬性,那麼系統可能會把這個項目放到溢出菜單中,但是當用戶選項了這個菜單項,它依然會顯示在action bar中。通過給android:showAsAction屬性添加“collapseActionView”屬性值,你能夠讓action view可以摺疊起來。
        因爲在用戶選擇這個item時,系統會展開這個action view,所以你不需要在onOptionsItemSelected()回調方法中響應這個菜單項。在用戶選擇這個菜單項時,系統會仍然會調用onOptionsItemSelected()方法,但是除非你在方法中返回了true(指示你已經替代系統處理了這個事件),否則系統會始終展開這個action view。
        當用戶選擇了action bar中的“向上”圖標或按下了回退按鈕時,系統也會把action view摺疊起來。如果需要,你能夠在代碼中通過在expandActionView()和collapseActionView()方法來展開或摺疊action view。
        注意:儘管把操作視窗摺疊起來是可選的,但是,如果包含了SearchView對象,建議你始終把這個視窗摺疊起來,只有在需要的時候,由用戶選擇後才把它給展開。在提供了專用的“搜索”按鈕的設備上也要小心了,如果用戶按下了“搜索”按鈕,那麼也應該把這個搜索action view給展開,簡單的重寫Activity的onKeyUp()回調方法,監聽KEYCODE_SEARCH類型的按鍵事件,然後調用expandActionView()方法即可。
        如果你需要根據操作視窗的可見性來更新你的Activity,那麼你可以定義一個OnActionExpandListener事件,並且用setOnActionExpandListener()方法來註冊這個事件,然後就能夠在操作視窗展開和摺疊時接受這個回調方法了。
@Override

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.options, menu);

    MenuItem menuItem = menu.findItem(R.id.actionItem);

    ...

    menuItem.setOnActionExpandListener(new OnActionExpandListener() {

        @Override

        public boolean onMenuItemActionCollapse(MenuItem item) {

            return true;          
        }

        @Override

        public boolean onMenuItemActionExpand(MenuItem item) {

            return true; 

        }

    });

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章