メニューを追加する

Compose を試す
Jetpack Compose は、Android に推奨される UI ツールキットです。Compose にコンポーネントを追加する方法を学習します。
<ph type="x-smartling-placeholder"></ph> TopAppBar →

メニューは、多くの種類のアプリで一般的なユーザー インターフェース コンポーネントです。宛先 使い慣れた一貫したユーザー エクスペリエンスを提供するには、 Menu API から アクティビティでユーザー アクションやその他のオプションを提示できます。

<ph type="x-smartling-placeholder">で確認できます。 <ph type="x-smartling-placeholder">
</ph> オーバーフロー メニューの例を示す画像 <ph type="x-smartling-placeholder">
</ph> 図 1.アイコンをタップしたときに表示されるメニュー オーバーフローメニューアイコンの下に 表示されます

このドキュメントでは、Google Chat 向けの 3 つの基本的なメニュー アクションのプレゼンテーション(すべてのバージョンの Android に対応):

オプション メニューとアプリバー
オプション メニューは、Google Chat の できます。組織内にグローバルな影響を及ぼすアクションを たとえば [検索]や「メールを作成して」[設定]で行えます

[作成] オプション メニューをご覧ください。 。

コンテキスト メニューとコンテキスト アクション モード
コンテキスト メニューはフローティング メニュー ユーザーがタップ操作や保持します。これは、 選択したコンテンツまたはコンテキスト フレームに影響するアクションを提供します。

コンテキスト アクション モードでは、ユーザーが操作できるアクション アイテムが 画面上部のバーで選択したコンテンツに変更が加えられ、 ユーザーが複数のアイテムを選択できるようにします。

コンテキスト メニューの作成をご覧ください。 。

ポップアップ メニュー
ポップアップ メニューには、 ビューを呼び出すことができます。アクションをオーバーフローさせるのに適している 特定のコンテンツに関連するコンテンツや 2 番目のパートの選択肢を提供する ありません。ポップアップ メニューの操作は、 それに対応するのがコンテキスト アクションです。代わりに、 ポップアップ メニューは、Google Chat のコンテンツ領域に関連する拡張アクションを 確認できます。

ポップアップ メニューを作成するをご覧ください。

XML でメニューを定義する

Android では、すべてのメニュータイプでメニューを定義するための標準 XML 形式が提供されます。 あります。アクティビティのコードでメニューを作成する代わりに、メニューを定義します。 そのすべてのアイテムを XML で メニュー リソースをご覧ください。Google Chat では 次に、メニュー リソースをインフレートして、Menu として読み込みます。 (アクティビティまたはフラグメント内)に配置する必要があります。

メニュー リソースを使用することをおすすめします。その理由は次のとおりです。

  • XML でメニュー構造の視覚化が簡単になる。
  • メニューのコンテンツとアプリの動作を分離する できます。
  • プラットフォームごとに異なるメニュー構成を作成できる 設定を使用して、バージョン、画面サイズ、その他の構成を アプリのリソース 説明します。

メニューを定義するには、プロジェクトの res/menu/ ディレクトリに移動し、次のようにメニューを作成します。 要素:

<menu>
メニュー項目のコンテナである Menu を定義します。 <menu> 要素はファイルのルートノードでなければならず、 1 つ以上の <item><group> を保持できます。 あります。
<item>
MenuItem, は、メニューの 1 つの項目を表します。この要素には、 <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
このアイテムがアクション アイテムとして表示されるタイミングと方法の仕様 。

これらは使用する最も重要な属性ですが、他にも多くの属性があります できます。サポートされているすべての属性については、 メニュー リソース ご覧ください

メニューの項目にサブメニューを追加するには、 <item> の子としての <menu> 要素。 サブメニューは、整理可能な機能が多数アプリに含まれている場合に便利です PC アプリのメニューバーのアイテム(ファイルEditView です。次の例をご覧ください。

<?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>

アクティビティでメニューを使用するには、メニュー リソースをインフレートして、 XML リソースをプログラム可能なオブジェクトに変換するために、 MenuInflater.inflate()。 以下のセクションでは、メニューの種類ごとにメニューをインフレートする方法について説明します。

[オプションを作成] メニュー

図 1 に示すオプション メニューでは、 関連するアクションやその他のオプションを表示します。 たとえば [検索]や「メールを作成して」[設定]で行えます

Google スプレッドシート アプリのアプリバーを示す画像
図 2. Google スプレッドシート アプリが表示されている アクション オーバーフロー ボタンなどの複数のボタン。

オプション メニューの項目は、 Activity サブクラスまたは Fragment 使用します。アクティビティとフラグメントの両方で、 オプション メニューでは、これらの項目は UI で結合されています。アクティビティの項目が その次に、フラグメントの順番で各フラグメントの要素が続きます。 アクティビティに追加されます。必要に応じて、 各要素の android:orderInCategory 属性 <item> 移動する必要があります。

アクティビティのオプション メニューを指定するには、オーバーライドします onCreateOptionsMenu()。 Fragment は、独自の 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 が返されるか、 すべてのフラグメントが呼び出されます

<ph type="x-smartling-placeholder">

実行時にメニュー項目を変更する

システムが onCreateOptionsMenu() を呼び出した後は、 呼び出されない Menu のインスタンスです。 メニューが無効になっていない限り、再度 onCreateOptionsMenu() を実行します。 ただし、onCreateOptionsMenu() は初期メニューの作成にのみ使用します 変更しないでください。

期間中に発生したイベントに基づいてオプション メニューを変更する場合は、 できます。これは、 onPrepareOptionsMenu() メソッドを呼び出します。このメソッドは、現在と同じように Menu オブジェクトを渡します。 アイテムの追加、削除、無効化など、プロパティを変更できるようにします。 Fragment は、 onPrepareOptionsMenu() 呼び出すことができます。

メニュー項目が表示される場合、オプション メニューは常に開いているとみなされます クリックします。イベントの発生時にメニューを更新したい場合は、 invalidateOptionsMenu() onPrepareOptionsMenu() を呼び出すようにリクエストします。

<ph type="x-smartling-placeholder">

コンテキスト メニューを作成する

フローティング コンテキスト メニューを示す画像
図 3. フローティング コンテキスト メニュー。

コンテキスト メニューには、特定の項目やコンテキストに影響するアクションが表示される UI で表示できますどのビューにもコンテキスト メニューを提供できますが、ほとんどの よく使われるのは RecylerView または ユーザーが各ビューに直接アクションを実行できる他のビュー コレクション 表示されます。

コンテキスト アクションを提供するには、次の 2 つの方法があります。

  • フローティング コンテキスト メニュー。メニュー メニュー項目がダイアログのようにフローティング リストとして表示される ユーザーがタッチ操作を行い、コンテキストのサポートを宣言するビューを保持します。 選択します。ユーザーは一度に 1 つのアイテムに対してコンテキスト アクションを実行できます。
  • コンテキスト アクション モード。このモードはシステム 実装 ActionMode 上部にコンテキスト アクションバー(CAB)を表示する 選択したアイテムに影響するアクション アイテムが表示されます。このモードが が有効である場合、ユーザーは複数のアイテムに対して同時に 対応しています。

注: コンテキスト メニューは、アイテムのショートカットとアイテム アイコンをサポートしていません。

フローティング コンテキスト メニューを作成する

フローティング コンテキスト メニューを提供する手順は次のとおりです。

  1. コンテキスト メニューが関連付けられている View を登録します。 通話中 registerForContextMenu() View を渡します。

    アクティビティで RecyclerView が使用されており、 同じコンテキスト メニューを提供する、すべてのアイテムをコンテキストに登録 RecyclerViewregisterForContextMenu()

  2. 実装 onCreateContextMenu() メソッドを Activity または Fragment で宣言します。

    登録済みのビューがタップと保留イベントがあると、システムは 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 をクエリします。この ID は、各メニュー項目に 次に示すように、XML で android:id 属性を使用するメニュー項目です。 XML でメニューを定義する

    メニュー項目を正常に処理する場合、true を返します。条件 メニュー項目を処理しない場合は、メニュー項目をスーパークラスに渡します。 説明します。アクティビティにフラグメントが含まれている場合、アクティビティは このコールバックを先に指定します。未処理のときにスーパークラスを呼び出すことで、 は、各フラグメントのそれぞれのコールバック メソッドにイベントを渡します。 各フラグメントが追加された順序で true または false が返されます。デフォルトの実装では 復路: Activityandroid.app.Fragment false であるため、処理されないときは必ずスーパークラスを呼び出します。

コンテキスト アクション モードを使用する

コンテキスト アクション モードは、 ActionMode: 目的達成に向けてユーザー操作を集中させる コンテキスト アクションを提供します。ユーザーがアイテムを選択してこのモードを有効にすると、 画面の上部にコンテキスト アクションバーが表示され、 選択したアイテムに対してユーザーが実行できる操作。このモードを有効にすると アプリが対応していれば、ユーザーは複数のアイテムを選択できます。また、選択を解除することもできます。 アクティビティ内の移動を続行できます。アクション モードが無効になっています コンテキスト アクションバーは、ユーザーがすべてのアイテムの選択を解除すると非表示になります。 [戻る] ボタンをタップするか、画面の左側で [完了] アクションをタップしたとき 表示されます。

<ph type="x-smartling-placeholder">

コンテキスト アクションを提供するビューの場合、通常はコンテキスト アクション モードを選択できます。

  • ユーザーがタッチ操作を行い、ビューを長押しします。
  • ユーザーがチェックボックスまたは類似の UI コンポーネントをビュー内で選択する。

アプリがコンテキスト アクション モードを呼び出して、 設計によって異なります。デザインは 2 つあります。

  • 個別の任意のビューでのコンテキスト アクション用。
  • 同じ階層のアイテムのグループに対して 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 インスタンスがすでに存在する場合は再作成されません。 アクションを開始する前にメンバーが null かどうかを確認してアクティブにする。 モードです。

ポップアップ メニューを作成する

右上のオーバーフロー ボタンに固定された、Gmail アプリのポップアップ メニューを示す画像。
図 4. Gmail アプリのポップアップ メニュー 右上のオーバーフローボタンに固定されます

PopupMenu View に固定されたモーダル メニューです。アンカーの下に表示されます スペースがある場合はビューに、そうでない場合はビューの上に表示されます。これは 次のとおりです。

  • 関連するアクションにオーバーフロー スタイル メニューを提供する たとえば、図 4 に示す Gmail のメールヘッダーなど、特定の内容のコンテンツのみです。
  • コマンド文の 2 番目の部分を提供する。たとえば、 Add。さまざまな [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> 要素を指定するか、 を 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>

グループに含まれるアイテムは、最初のアイテムと同じ階層に表示されます。 — メニューの 3 つのアイテムすべてが兄弟ノードになります。ただし、 グループ内の 2 つのアイテムの特性に合わせて、グループ ID を参照し、 使用できます。また、グループ化されたアイテムが分割されることはありません。対象 たとえば、各 ID に対して android:showAsAction="ifRoom" を宣言する場合、 両方がアクションバーに表示されるか、両方ともアクション オーバーフローします。

オンにできるメニュー項目を使用する

<ph type="x-smartling-placeholder">
図 5.サブメニュー オンにします。

メニューは、 単体のオプション用のチェックボックス、または サポートしています。図 5 は、 選択します。

<ph type="x-smartling-placeholder">

<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
グループの 1 つのアイテムのみをオンにできるため、ラジオボタンが表示されます できます。
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);
    }
}

このようにチェック状態を設定しない場合、 チェックボックスまたはラジオボタンが、ユーザーが選択しても変更されない。これを行うと、 状態を設定すると、アクティビティはアイテムのオンの状態を保持して、 ユーザーが後でメニューを開いたときに、設定したチェックボックスの状態は 表示されます。

<ph type="x-smartling-placeholder">

インテントに基づいてメニュー項目を追加する

メニュー項目からアクティビティを起動するために、 Intent, アプリのアクティビティか別のアプリのアクティビティかは 関係ありませんユーザーが 使用するインテントがわかっていて、開始される特定のメニュー項目があること インテントの引数を使用してインテントを startActivity() 適切な on-item-selected コールバック メソッド( onOptionsItemSelected() コールバック。

ただし、ユーザーのデバイスに そのインテントを呼び出すメニュー項目を追加すると、 機能しないメニュー項目。インテントがアクティビティに解決されない可能性があるためです。 これを解決するため、Android では、必要なときにメニュー項目をメニューに動的に追加できます。 Android は、インテントを処理するデバイス上のアクティビティを検出します。

インテントを受け入れる利用可能なアクティビティに基づいてメニュー項目を追加するには、次の操作を行います。 次のとおりです。

  1. カテゴリを使用してインテントを定義する CATEGORY_ALTERNATIVE または CATEGORY_SELECTED_ALTERNATIVE, その他の要件が適用されます
  2. 発信 Menu.addIntentOptions()。 次に、Android はインテントを実行できるアプリを検索し、 メニューに追加されます。

インテントを満たすアプリがインストールされていない場合、メニューはありません。 アイテムが追加されます。

<ph type="x-smartling-placeholder">

これを次の例に示します。

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() メソッドは、発生したイベントの数を返します。 メニュー項目を追加しました。

<ph type="x-smartling-placeholder">

アクティビティを他のメニューに追加できるようにする

アクティビティのサービスを他のアプリに提供することで、アプリが以下の状態を維持できるようになります。 (前述した役割を逆にする)というものです。

他のアプリメニューに含めるには、通常どおりインテント フィルタを定義します。 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>

インテント フィルタの記述について詳しくは、以下をご覧ください。 インテントとインテント フィルタ