Android添加Action按鈕

2018-08-02 18:32 更新

編寫:Vincent 4J - 原文:http://developer.android.com/training/basics/actionbar/adding-buttons.html

Action bar 允許我們?yōu)楫?dāng)前環(huán)境下最重要的操作添加按鈕。那些直接出現(xiàn)在 action bar 中的 icon 和/或文本被稱作action buttons(操作按鈕)。安排不下的或不足夠重要的操作被隱藏在 action overflow (超出空間的action,譯者注)中。

actionbar-actions

圖 1. 一個(gè)有search操作按鈕和 action overflow 的 action bar,在 action overflow 里能展現(xiàn)額外的操作。

在 XML 中指定操作

所有的操作按鈕和 action overflow 中其他可用的條目都被定義在 menu資源 的 XML 文件中。通過在項(xiàng)目的 res/menu 目錄中新增一個(gè) XML 文件來為 action bar 添加操作。

為想要添加到 action bar 中的每個(gè)條目添加一個(gè) <item> 元素。例如:

res/menu/main_activity_actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 搜索, 應(yīng)該作為動(dòng)作按鈕展示-->
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          android:showAsAction="ifRoom" />
    <!-- 設(shè)置, 在溢出菜單中展示 -->
    <item android:id="@+id/action_settings"
          android:title="@string/action_settings"
          android:showAsAction="never" />
</menu>

上述代碼聲明,當(dāng) action bar 有可用空間時(shí),搜索操作將作為一個(gè)操作按鈕來顯示,但設(shè)置操作將一直只在 action overflow 中顯示。(默認(rèn)情況下,所有的操作都顯示在 action overflow 中,但為每一個(gè)操作指明設(shè)計(jì)意圖是很好的做法。)

icon 屬性要求每張圖片提供一個(gè) resource ID。在 @drawable/ 之后的名字必須是存儲(chǔ)在項(xiàng)目目錄 res/drawable/ 下位圖圖片的文件名。例如:ic_action_search.png 對(duì)應(yīng) "@drawable/ic_action_search"。同樣地,title 屬性使用通過 XML 文件定義在項(xiàng)目目錄 res/values/ 中的一個(gè) string 資源,詳情請(qǐng)參見 創(chuàng)建一個(gè)簡單的 UI 。

注意:當(dāng)創(chuàng)建 icon 和其他 bitmap 圖片時(shí),要為不同屏幕密度下的顯示效果提供多個(gè)優(yōu)化的版本,這一點(diǎn)很重要。在 支持不同屏幕 課程中將會(huì)更詳細(xì)地討論。

如果為了兼容 Android 2.1 的版本使用了 Support 庫,在 android 命名空間下 showAsAction 屬性是不可用的。Support 庫會(huì)提供替代它的屬性,我們必須聲明自己的 XML 命名空間,并且使用該命名空間作為屬性前綴。(一個(gè)自定義 XML 命名空間需要以我們的 app 名稱為基礎(chǔ),但是可以取任何想要的名稱,它的作用域僅僅在我們聲明的文件之內(nèi)。)例如:

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" >
    <!-- 搜索, 應(yīng)該展示為動(dòng)作按鈕 -->
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          yourapp:showAsAction="ifRoom"  />
    ...
</menu>

為 Action Bar 添加操作

要為 action bar 布局菜單條目,就要在 activity 中實(shí)現(xiàn) onCreateOptionsMenu() 回調(diào)方法來 inflate 菜單資源從而獲取 Menu 對(duì)象。例如:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // 為ActionBar擴(kuò)展菜單項(xiàng)
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}

為操作按鈕添加響應(yīng)事件

當(dāng)用戶按下某一個(gè)操作按鈕或者 action overflow 中的其他條目,系統(tǒng)將調(diào)用 activity 中onOptionsItemSelected()的回調(diào)方法。在該方法的實(shí)現(xiàn)里面調(diào)用MenuItemgetItemId()來判斷哪個(gè)條目被按下 - 返回的 ID 會(huì)匹配我們聲明對(duì)應(yīng)的 <item> 元素中 android:id 屬性的值。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // 處理動(dòng)作按鈕的點(diǎn)擊事件
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_settings:
            openSettings();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

為下級(jí) Activity 添加向上按鈕

在不是程序入口的其他所有屏中(activity 不位于主屏?xí)r),需要在 action bar 中為用戶提供一個(gè)導(dǎo)航到邏輯父屏的up button(向上按鈕)。

actionbar-up.png

圖 2. Gmail 中的 up button。

當(dāng)運(yùn)行在 Android 4.1(API level 16) 或更高版本,或者使用 Support 庫中的 ActionBarActivity 時(shí),實(shí)現(xiàn)向上導(dǎo)航需要在 manifest 文件中聲明父 activity ,同時(shí)在 action bar 中設(shè)置向上按鈕可用。

如何在 manifest 中聲明一個(gè) activity 的父類,例如:

<application ... >
    ...
    <!-- 主 main/home 活動(dòng) (沒有上級(jí)活動(dòng)) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- 主活動(dòng)的一個(gè)子活動(dòng)-->
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!--  meta-data 用于支持 support 4.0 以及以下來指明上級(jí)活動(dòng) -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

然后,通過調(diào)用setDisplayHomeAsUpEnabled() 來把 app icon 設(shè)置成可用的向上按鈕:

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

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    // 如果你的minSdkVersion屬性是11活更高, 應(yīng)該這么用:
    // getActionBar().setDisplayHomeAsUpEnabled(true);
}

由于系統(tǒng)已經(jīng)知道 MainActivity 是 DisplayMessageActivity 的父 activity,當(dāng)用戶按下向上按鈕時(shí),系統(tǒng)會(huì)導(dǎo)航到恰當(dāng)?shù)母?activity - 你不需要去處理向上按鈕的事件。

更多關(guān)于向上導(dǎo)航的信息,請(qǐng)見 提供向上導(dǎo)航。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)