actionBar添加action圖片和點擊事件

Action bar允許你爲與當前應用上下文相關的最重要的action items添加action按鈕。那些直接顯示在action bar上的icon或者文字都被稱作action buttons。那些不適合action bar或者不是那麼重要的Actions將會被隱藏在action overflow(譯者注:action bar最右側的垂直的三個點)裏。

圖1. 一個包含Search功能的action button和用來展示附加action的action overflow。

在XML文件中指定Actions

所有的action buttons和能夠在action overflow中訪問到的action都是在一個XML menu resource中被定義的。要爲action bar添加actions,首先在項目的res/menu/ 目錄下創建一個新的XML文件。

爲所有你想要添加到action bar中的item添加一個<item> 元素。例如:

res/menu/main_activity_actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- Search, should appear as action button -->
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          android:showAsAction="ifRoom" />
    <!-- Settings, should always be in the overflow -->
    <item android:id="@+id/action_settings"
          android:title="@string/action_settings"
          android:showAsAction="never" />
</menu>

下載 action bar icons

爲了最好的適配Android iconography引導,你應該使用Action Bar Icon Pack中提供的icons。

上面的XML文件聲明瞭Search action在action bar有空間的時候會展示爲action button,而Setting action始終都要出現在overflow中。 (默認情況下,所有的actions 都出啊先在overflow中,但是爲每個action聲明不同的設計意圖其實是件好事。)

icon 屬性需要指定一個圖片資源ID。以@drawable/ 開頭的資源必須是你以同樣的名字存放在項目的res/drawable/ 目錄下的資源。例如,"@drawable/ic_action_search" 表示ic_action_search.png。同樣的,title 屬性使用的是一個字符串資源,它在項目的res/values/ 目錄下的XML文件中被定義,就像在 Building a Simple User Interface中討論的那樣。

提示: 當爲應用創建icons或者其他bitmap圖片時,爲不同的屏幕密度提供不同的優化的版本相當重要。這個話題會在Supporting Different Screens中有更多的討論。

如果你的應用在使用Support LibraryshowAsAction屬性並不能使用android: 這個命名空間。作爲替代這個屬性是由Support Library提供,並且你需要定義自己的XML命名空間同時使用它作爲這個屬性的前綴。(自定義的XML命名空間應該基於應用名稱,但是你也可以取一個你想要的名字,同時它只在你聲明過的它的文件中有效。) 例如:

res/menu/main_activity_actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <!-- Search, should appear as action button -->
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          yourapp:showAsAction="ifRoom"  />
    ...
</menu>
爲Action Bar添加Actions

爲了讓剛纔的menu items顯示在action bar上,在你的activity中實現onCreateOptionsMenu() 這個回掉方法,並且爲給定的參數Menu 對象設置對應的/menu目錄下的XML文件。例如:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}
響應Action Buttons

當用戶點擊任何一個action buttons 或者overflow中的action item,系統都會調用onOptionsItemSelected() 方法。在你對這個方法的實現中,調用參數MenuItem對象的getItemId()來獲取表示被點擊的item的資源ID,這個值是你在相應的<item> 元素中聲明的android:id 屬性的值。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_settings:
            openSettings();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
爲低版本的Activity添加Up按鈕

Figure 4. The Up button in Gmail.

在你的應用中,只要不是你的應用入口activity(activities that are not the "home" screen) 的所有activity都應該提供一個返回自己在應用層次結構中的邏輯父界面,通過點擊action bar上的Up按鈕。

當運行在Android 4.1 (API level 16) 或者更高版本的系統上時,或者當使用Support Library包提供的ActionBarActivity 時,使用Up導航需要你在manifest文件中聲明父activity,同時啓用action bar的Up按鈕。

例如,下面顯示如何在manifest文件中定義一個父activity:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

然後通過調用setDisplayHomeAsUpEnabled()方法啓用action bar的Up按鈕:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_displaymessage);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    // If your minSdkVersion is 11 or higher, instead use:
    // getActionBar().setDisplayHomeAsUpEnabled(true);
}

由於現在系統知道MainActivity 是DisplayMessageActivity的父activity,當用戶點擊 Up button時,系統會自動導航到何時的父activity中——你沒有必要處理Up button的點擊事件。

發佈了147 篇原創文章 · 獲贊 19 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章