20
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android アプリにメニューを追加する

Posted at
リソース管理フォルダにメニュー用のフォルダを追加

resで右クリックして新規→Android リソース・ディレクトリーを選択

WS000000.JPG

リソース・タイプの箇所で「menu」を選択して「OK」

WS000001.JPG

メニュー用のリソースファイルを追加

追加したmenuフォルダで右クリックして新規→Menu リソース/ファイルを選択

WS000002.JPG

名前は適当に入力して(今回は「option」と入力)「OK」

WS000003.JPG

メニュー用リソースファイルを編集

「option.xml」というファイルが作成されるので、以下のように編集

option.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuItem1"
        android:title="メニュー1" />
    <item
        android:id="@+id/menuItem2"
        android:title="メニュー2" />
</menu>
アクティビティにメニューを紐付ける
MainActivity.java
public class MainActivity extends AppCompatActivity {
    ...

    // メニューをActivity上に設置する
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // 参照するリソースは上でリソースファイルに付けた名前と同じもの
        getMenuInflater().inflate(R.menu.option, menu);
        return super.onCreateOptionsMenu(menu);
    }
    
    // メニューが選択されたときの処理
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menuItem1:
                ...
                return true;

            case R.id.menuItem2:
                ...
                return true;
                
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

これで(たったこれだけで)アプリの右肩あたりにメニューが表示される。

getMenuInfrater.infrate()するときに複数のメニューを紐付けることが可能。
例えば、アプリ共通のグローバルメニューをinfrate()しといて、画面固有のものをあとからinfrate()するといった感じ。

getMenuInfrater().inflate(R.menu.global_menu, menu);
getMenuInfrater().inflate(R.menu.sub_menu, menu);

この場合、各メニューのレイアウトファイルで

global_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuQuit"
        android:title="終了"
        android:orderInCategory="90"/>
</menu>
sub_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuSub1"
        android:title="サブメニュー"
        android:orderInCategory="1" />
    <item
        android:id="@+if/menuSub2"
        android:title="サブメニューその2"
        android:orderInCategory="2" />
</menu>

といった感じでorderInCategoryを指定してあげると、値の昇順に並べ替えて表示してくれるようになる。
もしこのやり方をやるなら、Androidの開発ガイドにも書かれてるとおり、共通のグローバルメニューに対応したonCreateOptionsMenu()とonOptionsItemSelected()が実装されたActivityを作成しておき、各Activityはこれを継承してオーバーライドしてやれば問題ない。

継承する場合は、onCreateOptionsMenu()内でsuper.onCreateOptionsMenu(menu);とやったあと、自Activityで利用させたいメニューについてはmenu.add()で追加していく形になるっぽい。

20
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?