新增菜單

試用 Compose
Jetpack Compose 是 Android 推薦的 UI 工具包。瞭解如何在 Compose 中新增元件。

選單是多種應用程式常見的使用者介面元件。目的地: 來提供使用者熟悉且一致的體驗 將 Menu API 套用至 會在活動中顯示使用者動作和其他選項。

,瞭解如何調查及移除這項存取權。
顯示溢位選單範例的圖片
圖 1.由輕觸圖示觸發的選單 (顯示於溢位選單圖示下方)。

本文件說明如何建立三種基本類型的選單 所有 Android 版本的動作簡報:

選項選單和應用程式列
選項選單是 活動。請在這裡放置對全球影響力 例如「搜尋」「撰寫電子郵件」和「設定」

請參閱建立選項選單 專區。

內容選單及關聯動作模式
內容選單是一種浮動式選單 這個對話方塊會在使用者輕觸畫面後顯示會保留元素這項服務 提供的操作會影響所選的內容或內容畫面。

關聯動作模式會顯示會 會影響畫面頂端列中所選的內容 使用者選取多個項目

請參閱建立內容選單 專區。

彈出式選單
彈出式選單顯示項目垂直清單,固定在 就會看到叫用選單的檢視畫面很適合提供動作溢位 或提供第二部分的選項 加上指令在彈出式選單中的動作,不會直接影響 這就是關聯動作的目的相反地 彈出式選單適合用來擴充與 您的活動。

請參閱「建立彈出式選單」一節。

以 XML 定義選單

對於所有選單類型,Android 都提供標準的 XML 格式來定義選單 項目。與其在活動程式碼中建構選單,不如定義選單和 XML 中的所有項目 選單資源。你可以 接著加載選單資源,以 Menu 形式載入該資源 物件) 檔案。

使用選單資源是很好的做法,原因如下:

  • 在 XML 中可以更簡單明暸地看到選單結構。
  • 可將選單內容與應用程式行為分開 再也不是件繁重乏味的工作
  • 可讓你為不同平台建立替代選單設定 版本、螢幕大小和其他設定 應用程式資源 這個架構的重點在於

如要定義選單,請在專案的 res/menu/ 目錄,並使用以下程式碼建構選單 元素:

<menu>
定義一個 Menu,這是選單項目使用的容器。A 罩杯 <menu> 元素必須是檔案的根節點, 可包含一或多個 <item><group> 元素。
<item>
建立 MenuItem, 代表選單中的單一項目這個元素可包含巢狀結構 <menu> 元素:建立子選單。
<group>
<item> 的隱藏容器 (非必要) 元素。可用來分類選單項目,使其可以共用下列屬性: 設為啟用狀態與瀏覽權限詳情請參閱 建立菜單群組專區。

以下是名為 game_menu.xml 的選單範例:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/new_game"
          android:icon="@drawable/ic_new_game"
          android:title="@string/new_game"
          app:showAsAction="ifRoom"/>
    <item android:id="@+id/help"
          android:icon="@drawable/ic_help"
          android:title="@string/help" />
</menu>

<item> 元素支援多種可用屬性 定義項目的外觀和行為。上一個選單中的項目 包含下列屬性:

android:id
項目專屬的資源 ID,可讓應用程式 識別此項目 使用者選取該專案
android:icon
可繪項目的參照,用來作為項目的圖示。
android:title
字串的參照,用來作為項目標題。
android:showAsAction
指定此項目顯示為操作項目的時間和方式規格 。

這些是最重要的屬性 廣告。如需所有支援屬性的詳細資訊,請參閱 選單資源 說明文件。

如果要在任一選單的項目中加入子選單,只要新增 <menu> 元素做為 <item> 的子項。 應用程式有很多功能可供整理時,最適合使用子選單 轉換為主題,例如電腦應用程式選單列中的項目,例如「檔案」 [編輯] 和 [檢視]。請參閱以下範例:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/file"
          android:title="@string/file" >
        <!-- "file" submenu -->
        <menu>
            <item android:id="@+id/create_new"
                  android:title="@string/create_new" />
            <item android:id="@+id/open"
                  android:title="@string/open" />
        </menu>
    </item>
</menu>

如要在活動中使用選單,請「inflate」選單資源,然後進行轉換 將 XML 資源傳入可程式化的物件 MenuInflater.inflate()。 以下各節將說明如何為每種選單類型加載選單。

建立選項選單

選項選單 (例如圖 1 所示的選項選單) 包含 與目前活動內容相關的動作和其他選項 例如「搜尋」「撰寫電子郵件」和「設定」

這張圖片顯示 Google 試算表應用程式的應用程式列
圖 2. Google 試算表應用程式。 ,包括動作溢位按鈕在內

如要在選項選單中宣告項目,請前往: Activity 子類別或 Fragment 子類別。如果您的活動和片段都宣告了 選項選單,那麼這些項目就會在 UI 中合併顯示。系統會顯示活動項目 ,接著是各個片段的這些片段,按照片段的順序 都會新增到活動中。如有需要,你可以使用 每個屬性的 android:orderInCategory 屬性 您需要移動 <item>

若要指定活動的選項選單,請覆寫 onCreateOptionsMenu()。 片段 onCreateOptionsMenu() 回呼。使用這個方法時,您可以加載選單資源 在 XML 中定義的,包含在Menu 回呼。例如:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater: MenuInflater = menuInflater
    inflater.inflate(R.menu.game_menu, menu)
    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.game_menu, menu);
    return true;
}

您也可以使用 add() 並擷取 findItem() 使用 MenuItem API 修改屬性。

處理點擊事件

使用者從選項選單中選取項目 (包括操作項目) 系統會在應用程式列中呼叫活動的 onOptionsItemSelected() 方法。此方法會傳遞所選的 MenuItem。您可以找出 呼叫 getItemId(), 會傳回選單項目的專屬 ID,由 選單資源中的 android:id 屬性,或以整數指定 加入 add() 方法您可以將這個 ID 與已知選單進行比對 執行適當的動作。

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle item selection.
    return when (item.itemId) {
        R.id.new_game -> {
            newGame()
            true
        }
        R.id.help -> {
            showHelp()
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

Java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection.
    switch (item.getItemId()) {
        case R.id.new_game:
            newGame();
            return true;
        case R.id.help:
            showHelp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

成功處理選單項目後,將 true 傳回。如果發生以下情況: 使用者不必處理選單項目,請呼叫 onOptionsItemSelected()。預設導入方式會傳回 false。

如果活動包含片段,系統會先呼叫 用於活動的 onOptionsItemSelected(),接著針對每個片段 依序排列,直到片段傳回 true 或 所有片段都會呼叫這個方法。

在執行階段變更選單項目

當系統呼叫 onCreateOptionsMenu() 後,它會保留 您填入且未呼叫的 Menu 例項 除非選單失效,否則再次 onCreateOptionsMenu()。 不過,只使用 onCreateOptionsMenu() 建立初始選單 而非在活動生命週期期間進行變更

若要根據 您可以前往活動生命週期 onPrepareOptionsMenu() 方法。這個方法會傳遞目前 Menu 物件給您 ,因此您可以新增、移除或停用項目等,進行修改。 片段也提供 onPrepareOptionsMenu() 回呼。

以下列方式顯示選單項目時,選項選單會一律開啟 應用程式列。當事件發生且您想更新選單時,請呼叫 invalidateOptionsMenu() 要求系統呼叫 onPrepareOptionsMenu()

建立內容選單

顯示浮動內容選單的圖片
圖 3. 浮動內容選單。

內容選單可提供會影響特定項目或情境的操作 使用者介面的影格速率您可以為任何檢視畫面提供內容選單,但大多數 通常用於 RecylerView或 使用者可以在當中直接對各項資源執行動作的其他檢視畫面集合 項目。

提供內容關聯操作的方法有兩種:

  • 浮動內容選單中。選單 會以浮動清單的形式顯示選單項目,類似於對話方塊。 使用者進行觸控後保留可宣告結構定義支援的檢視畫面 或前往 Google 試算表選單使用者一次可以對一個項目執行內容關聯操作。
  • 關聯動作模式中。這個模式是系統 實作 ActionMode 會在網頁頂端顯示關聯動作列 (簡稱 CAB) 顯示影響所選項目的操作項目。何時處於這個模式 有效,使用者可以一次對多個項目執行一項操作 (如果您 但應用程式都支援這項功能

注意: 內容選單不支援項目捷徑和項目圖示。

建立浮動內容選單

如要提供浮動內容選單,請執行下列步驟:

  1. 註冊與內容選單相關聯的 View 撥號中 registerForContextMenu() 然後傳送 View

    如果您的活動使用 RecyclerView,而您想為每個活動個別設定 項目來提供相同的內容選單,請為內容註冊所有項目 方法是將 RecyclerView 傳遞至 registerForContextMenu()

  2. 實作 onCreateContextMenu() ActivityFragment 中的方法。

    註冊的檢視畫面收到觸控和保留事件時,系統會呼叫 您的 onCreateContextMenu() 方法。您可以在這個檔案中 加載選單資源,如下所示 範例:

    Kotlin

        override fun onCreateContextMenu(menu: ContextMenu, v: View,
                                menuInfo: ContextMenu.ContextMenuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo)
            val inflater: MenuInflater = menuInflater
            inflater.inflate(R.menu.context_menu, menu)
        }
        

    Java

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                                        ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.context_menu, menu);
        }
        

    MenuInflater 可讓您從選單資源加載內容選單。回呼方法 參數包括使用者選取的 ViewContextMenu.ContextMenuInfo 物件,提供選取項目之額外資訊。如果 您的活動有多個檢視畫面,每個檢視畫面提供不同的內容選單 您可以利用這些參數 決定要在 加載。

  3. 導入設定 onContextItemSelected(), 如以下範例所示當使用者選取選單項目時, 系統會呼叫這個方法,讓您可以執行適當的動作。

    Kotlin

        override fun onContextItemSelected(item: MenuItem): Boolean {
            val info = item.menuInfo as AdapterView.AdapterContextMenuInfo
            return when (item.itemId) {
                R.id.edit -> {
                    editNote(info.id)
                    true
                }
                R.id.delete -> {
                    deleteNote(info.id)
                    true
                }
                else -> super.onContextItemSelected(item)
            }
        }
        

    Java

        @Override
        public boolean onContextItemSelected(MenuItem item) {
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            switch (item.getItemId()) {
                case R.id.edit:
                    editNote(info.id);
                    return true;
                case R.id.delete:
                    deleteNote(info.id);
                    return true;
                default:
                    return super.onContextItemSelected(item);
            }
        }
        

    getItemId() 方法會查詢所選選單項目的 ID,您指派給每個選單項目 在 XML 中透過 android:id 屬性使用選單項目,如 以 XML 定義選單

    成功處理選單項目後,將 true 傳回。如果 您不需要處理選單項目,請將選單項目傳遞至父類別 。如果活動含有片段,活動會收到 這個回呼。在未處理的情況下呼叫父類別 會將該事件傳遞至每個片段中相應的回呼方法, 時間,依每個片段的新增順序,直到 true 或 傳回 falseActivityandroid.app.Fragment退貨 false,因此在未處理時,一律呼叫父類別。

使用關聯動作模式

關聯動作模式是系統實作 ActionMode:著重於使用者互動以提高成效 關聯動作當使用者選取某個項目啟用這個模式時, 關聯動作列: 可對選取的項目執行的操作。啟用這個模式後 使用者可以選取多個項目 (前提是應用程式支援這項功能),然後 項目,並繼續在活動中瀏覽。動作模式已停用 當使用者取消選取所有項目時,關聯動作列就會消失 輕觸「返回」按鈕,或輕觸畫面左側的「完成」動作

針對提供內容關聯操作的檢視畫面,您通常會叫用內容相關動作 動作模式。

  • 使用者執行觸控與停留在檢視畫面上
  • 使用者在檢視畫面中選取核取方塊或類似的 UI 元件。

應用程式如何叫用關聯動作模式及 每個動作的行為都取決於您的設計。目前有兩種設計:

  • 用於個別任意檢視畫面的內容關聯操作。
  • 針對項目中的一組項目,執行批次關聯操作 RecyclerView:可讓使用者選取多個項目, 執行特定動作

以下章節介紹了各個情境所需的設定。

為個別檢視畫面啟用關聯動作模式

如果希望只在使用者選取 請執行下列步驟:

  1. 實作 ActionMode.Callback 介面,如 範例。在回呼方法中,您可以指定 關聯動作列、回應操作項目的點擊事件,以及 處理動作模式的其他生命週期事件。

    Kotlin

        private val actionModeCallback = object : ActionMode.Callback {
            // Called when the action mode is created. startActionMode() is called.
            override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
                // Inflate a menu resource providing context menu items.
                val inflater: MenuInflater = mode.menuInflater
                inflater.inflate(R.menu.context_menu, menu)
                return true
            }
    
            // Called each time the action mode is shown. Always called after
            // onCreateActionMode, and might be called multiple times if the mode
            // is invalidated.
            override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false // Return false if nothing is done
            }
    
            // Called when the user selects a contextual menu item.
            override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
                return when (item.itemId) {
                    R.id.menu_share -> {
                        shareCurrentItem()
                        mode.finish() // Action picked, so close the CAB.
                        true
                    }
                    else -> false
                }
            }
    
            // Called when the user exits the action mode.
            override fun onDestroyActionMode(mode: ActionMode) {
                actionMode = null
            }
        }
        

    Java

        private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {
    
            // Called when the action mode is created. startActionMode() is called.
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // Inflate a menu resource providing context menu items.
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.context_menu, menu);
                return true;
            }
    
            // Called each time the action mode is shown. Always called after
            // onCreateActionMode, and might be called multiple times if the mode
            // is invalidated.
            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false; // Return false if nothing is done.
            }
    
            // Called when the user selects a contextual menu item.
            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
               switch (item.getItemId()) {
                    case R.id.menu_share:
                        shareCurrentItem();
                        mode.finish(); // Action picked, so close the CAB.
                        return true;
                    default:
                        return false;
                }
            }
    
            // Called when the user exits the action mode.
            @Override
            public void onDestroyActionMode(ActionMode mode) {
                actionMode = null;
            }
        };
        

    這些事件回呼與 選項選單,除了上述任一選項之外 也會傳遞與事件相關聯的 ActionMode 物件。 您可以使用 ActionMode API 對 例如將標題和子標題 setTitle()setSubtitle(), 這適用於表示已選取的項目數量。

    上述範例會將 actionMode 變數設為 刪除動作模式時為 null。在下一個步驟中,請參閱 初始化方式,以及如何在活動或活動中儲存成員變數 片段很實用。

  2. 致電 startActionMode() 何時 (例如使用者輕觸, 停留在檢視畫面上

    Kotlin

        someView.setOnLongClickListener { view ->
            // Called when the user performs a touch & hold on someView.
            when (actionMode) {
                null -> {
                    // Start the CAB using the ActionMode.Callback defined earlier.
                    actionMode = activity?.startActionMode(actionModeCallback)
                    view.isSelected = true
                    true
                }
                else -> false
            }
        }
        

    Java

        someView.setOnLongClickListener(new View.OnLongClickListener() {
            // Called when the user performs a touch & hold on someView.
            public boolean onLongClick(View view) {
                if (actionMode != null) {
                    return false;
                }
    
                // Start the CAB using the ActionMode.Callback defined earlier.
                actionMode = getActivity().startActionMode(actionModeCallback);
                view.setSelected(true);
                return true;
            }
        });
        

    當您呼叫 startActionMode() 時,系統會傳回 已建立「ActionMode」。將此項目儲存至成員變數中 變更關聯動作列以回應其他事件。 在上述範例中,ActionMode 是用來確保 如果 ActionMode 執行個體已存在,系統不會重新建立該執行個體 啟用,方法是先檢查成員是否為空值,再開始操作 模式。

建立彈出式選單

這張圖片顯示 Gmail 應用程式的彈出式選單,選單固定在右上方的溢位按鈕上。
圖 4. Gmail 應用程式中的彈出式選單 固定在右上角的溢位按鈕上。

PopupMenu 是固定在 View 的強制回應選單。會顯示在錨定標記下方 看看是否有空間,或位於檢視畫面上方。這項功能非常實用 包括:

  • 相關的動作提供溢位樣式選單 例如 Gmail 的電子郵件標頭等特定內容,如圖 4 所示。
  • 提供指令語句的第二部分,例如標示有 新增,以產生具有不同「Add」的彈出式選單 只要設定成「自動重新啟動」 和「在主機維護期間」選項即可
  • 提供與 Spinner 不會保留永久選項

如果您以 XML 定義選單,以下是顯示 彈出式選單:

  1. 利用其建構函式將 PopupMenu 例項化,此函式會採用 目前使用的應用程式 Context和 選單錨定位置的 View
  2. 使用 MenuInflater 將選單資源加載至 Menu 物件由 傳回 PopupMenu.getMenu()
  3. 呼叫 PopupMenu.show()

例如,以下是顯示彈出式選單的按鈕:

<ImageButton
    android:id="@+id/dropdown_menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/descr_overflow_button"
    android:src="@drawable/arrow_drop_down" />

這項活動隨即會顯示如下的彈出式選單:

Kotlin

findViewById<ImageButton>(R.id.dropdown_menu).setOnClickListener {
    val popup = PopupMenu(this, it)
    val inflater: MenuInflater = popup.menuInflater
    inflater.inflate(R.menu.actions, popup.menu)
    popup.show()
}

Java

findViewById(R.id.dropdown_menu).setOnClickListener(v -> {
    PopupMenu popup = new PopupMenu(this, v);
    popup.getMenuInflater().inflate(R.menu.actions, popup.getMenu());
    popup.show();
});

當使用者選取某個項目,或輕觸選單以外的位置時,選單就會關閉 您可以使用以下項目來監聽關閉事件: PopupMenu.OnDismissListener

處理點擊事件

如要在使用者選取選單項目時執行動作,請實作 PopupMenu.OnMenuItemClickListener 並呼叫PopupMenu setOnMenuItemclickListener()。 當使用者選取某個項目時,系統會呼叫 onMenuItemClick() 回呼。

例如:

Kotlin

fun showMenu(v: View) {
    PopupMenu(this, v).apply {
        // MainActivity implements OnMenuItemClickListener.
        setOnMenuItemClickListener(this@MainActivity)
        inflate(R.menu.actions)
        show()
    }
}

override fun onMenuItemClick(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.archive -> {
            archive(item)
            true
        }
        R.id.delete -> {
            delete(item)
            true
        }
        else -> false
    }
}

Java

public void showMenu(View v) {
    PopupMenu popup = new PopupMenu(this, v);

    // This activity implements OnMenuItemClickListener.
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
}

@Override
public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.archive:
            archive(item);
            return true;
        case R.id.delete:
            delete(item);
            return true;
        default:
            return false;
    }
}

建立選單群組

選單群組是指一組共用特定特色的選單項目集合。內建 群組,可以執行下列作業:

您可以在內部建立 <item> 元素的巢狀結構,藉此建立群組 在您的選單資源中新增 <group> 元素,或指定 群組 ID add() 方法。

以下是含有群組的選單資源範例:

<?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/menu_save"
          android:title="@string/menu_save" />
    <!-- menu group -->
    <group android:id="@+id/group_delete">
        <item android:id="@+id/menu_archive"
              android:title="@string/menu_archive" />
        <item android:id="@+id/menu_delete"
              android:title="@string/menu_delete" />
    </group>
</menu>

群組中的項目會與第一個項目顯示相同的層級 項目—選單中全部三個項目皆為同層級。不過,您可以 找出群組內兩個項目的特性,方法是參照群組 ID,並使用 上述方法。系統也不會將群組的項目分開。適用對象 舉例來說,如果您為每個值宣告 android:showAsAction="ifRoom" 兩個項目都會出現在動作列中,或同時顯示在動作列中 溢位

使用可勾選的選單項目

圖 5.包含 可勾選的項目。

選單可做為開啟和關閉選項的介面, 核取方塊,或用於共同選項群組的圓形按鈕 獨家選項圖 5 顯示的子選單包含可勾選項目的項目 圓形按鈕。

您可以使用 <item> 中的 android:checkable 屬性 元素,或是以 android:checkableBehavior 定義整個群組 屬性加入 <group> 元素中。例如, 這個選單群組可透過圓形按鈕勾選:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item android:id="@+id/red"
              android:title="@string/red" />
        <item android:id="@+id/blue"
              android:title="@string/blue" />
    </group>
</menu>

android:checkableBehavior 屬性接受以下其中一項: 包括:

single
只能勾選群組中的一個項目 (產生圓形按鈕) 按鈕。
all
所有項目均可勾選,產生核取方塊。
none
沒有可勾選的項目。

您可以使用 <item> 元素中的 android:checked 屬性 然後使用 setChecked() 方法。

選取可勾選項目時,系統會呼叫相應的 所選項目的回呼方法,例如 onOptionsItemSelected()。 請在這裡設定核取方塊狀態 按鈕不會自動變更狀態。您可以查詢目前的狀態 就像使用者選取商品之前一樣 isChecked() 然後使用 setChecked() 設定已勾選狀態顯示位置: 範例:

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.vibrate, R.id.dont_vibrate -> {
            item.isChecked = !item.isChecked
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

Java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.vibrate:
        case R.id.dont_vibrate:
            if (item.isChecked()) item.setChecked(false);
            else item.setChecked(true);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

如果您未以這種方式設定勾選狀態, 核取方塊或圓形按鈕不會因使用者選取而改變。操作時間 設定狀態時,活動會保留已勾選的項目狀態, 使用者稍後開啟選單時,您設定的已勾選狀態 顯示。

根據意圖新增選單項目

有時候,您可能想讓選單項目使用 Intent, 做為應用程式或其他應用程式的活動當您 瞭解您要使用的意圖,並透過特定選單項目來啟動該意圖 您就能使用 startActivity() 適當的回呼方法,例如 onOptionsItemSelected() 回呼。

然而,如果您不確定使用者裝置是否含有 系統處理意圖,然後新增會叫用該意圖的選單項目,可能會導致 選單項目無法運作,因為意圖可能無法解析為活動。 為此,Android 可讓您以動態方式將選單項目加入選單 Android 會在裝置上尋找處理意圖的活動。

如要根據可接受意圖的活動新增選單項目,請 包括:

  1. 按照類別定義意圖 CATEGORY_ALTERNATIVECATEGORY_SELECTED_ALTERNATIVE, 或兩者,以及任何其他規定
  2. 致電 Menu.addIntentOptions()。 Android 接著會搜尋任何可執行意圖的應用程式 即可將方案加入選單

如果沒有任何安裝的應用程式符合這項意圖,則不會顯示選單 已新增 個項目。

例如:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    super.onCreateOptionsMenu(menu)

    // Create an Intent that describes the requirements to fulfill, to be
    // included in the menu. The offering app must include a category value
    // of Intent.CATEGORY_ALTERNATIVE.
    val intent = Intent(null, dataUri).apply {
        addCategory(Intent.CATEGORY_ALTERNATIVE)
    }

    // Search and populate the menu with acceptable offering apps.
    menu.addIntentOptions(
            R.id.intent_group,  // Menu group to which new items are added.
            0,                  // Unique item ID (none).
            0,                  // Order for the items (none).
            this.componentName, // The current activity name.
            null,               // Specific items to place first (none).
            intent,             // Intent created above that describes the requirements.
            0,                  // Additional flags to control items (none).
            null)               // Array of MenuItems that correlate to specific items (none).

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu){
    super.onCreateOptionsMenu(menu);

    // Create an Intent that describes the requirements to fulfill, to be
    // included in the menu. The offering app must include a category value
    // of Intent.CATEGORY_ALTERNATIVE.
    Intent intent = new Intent(null, dataUri);
    intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

    // Search and populate the menu with acceptable offering apps.
    menu.addIntentOptions(
         R.id.intent_group,         // Menu group to which new items are added.
         0,                         // Unique item ID (none).
         0,                         // Order for the items (none).
         this.getComponentName(),   // The current activity name.
         null,                      // Specific items to place first (none).
         intent,                    // Intent created above that describes the requirements.
         0,                         // Additional flags to control items (none).
         null);                     // Array of MenuItems that correlate to specific items (none).

    return true;
}

針對每個找到提供符合意圖的意圖篩選器的活動 系統會使用意圖篩選器的值 android:label 做為選單項目標題,並以應用程式圖示做為選單 項目圖示。addIntentOptions() 方法會傳回 已新增菜單品項。

允許將活動新增至其他選單

您可以為其他應用程式提供活動服務,讓您的應用程式 ,透過還原先前所述的角色。

照常定義意圖篩選器,並加入其他應用程式的選單中 但包含 CATEGORY_ALTERNATIVE 或 意圖的 CATEGORY_SELECTED_ALTERNATIVE 值 (或兩者皆是) 篩選類別。例如:

<intent-filter label="@string/resize_image">
    ...
    <category android:name="android.intent.category.ALTERNATIVE" />
    <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
    ...
</intent-filter>

如要進一步瞭解如何在 中編寫意圖篩選器,請參閱 意圖和意圖 篩選器