質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1958閲覧

menuでlayoutにおけるincludeのようなことをしたい

shal0ne

総合スコア51

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1グッド

0クリップ

投稿2018/09/23 17:31

前提・実現したいこと

同一アクティビティ内のNavigationDrawerのメニューで、menu1,2の二つをスイッチしながら使いたいです。
その際xmlソースコード内のCommonItemA,Bに関してはmenu1と2で共通なので、layoutのincludeのようにスマートに書きたいです。
また、最悪xmlのほうがスマートに書けずともMainActivityのonNavigationItemSelectedだけでもスマートに書きたいと思いましたが、自分の技量ではその方法も見つけられませんでした。

該当のソースコード

xml

1<!--menu1.xml--> 2<?xml version="1.0" encoding="utf-8"?> 3<menu xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 tools:showIn="navigation_view"> 6 7 <group android:checkableBehavior="single"> 8 <item 9 android:id="@+id/item1" 10 android:icon="@drawable/..." 11 android:title="ItemA" /> 12 <item 13 android:id="@+id/item2" 14 android:icon="@drawable/..." 15 android:title="ItemB" /> 16 </group> 17 18 <item android:title="Commons"> 19 <menu> 20 <item 21 android:id="@+id/common_item1" 22 android:icon="@drawable/..." 23 android:title="CommonItemA" /> 24 <item 25 android:id="@+id/common_item2" 26 android:icon="@drawable/..." 27 android:title="CommonItemB" /> 28 </menu> 29 </item> 30</menu>

xml

1<!--menu2.xml--> 2<?xml version="1.0" encoding="utf-8"?> 3<menu xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 tools:showIn="navigation_view"> 6 7 <group android:checkableBehavior="single"> 8 <item 9 android:id="@+id/item3" 10 android:icon="@drawable/..." 11 android:title="ItemC" /> 12 </group> 13 14 <item android:title="Commons"> 15 <menu> 16 <item 17 android:id="@+id/common_item3" 18 android:icon="@drawable/..." 19 android:title="CommonItemA" /> 20 <item 21 android:id="@+id/common_item4" 22 android:icon="@drawable/..." 23 android:title="CommonItemB" /> 24 </menu> 25 </item> 26</menu>

Java

1 2//MainActivity 3 4... 5 6public boolean onNavigationItemSelected(MenuItem item) { 7 int id = item.getItemId(); 8 9 if (id == R.id.item1) { 10 //処理 11 } else if (id == R.id.item2) { 12 13 } else if (id == R.id.item3) { 14 15 } else if (id == R.id.common_item1) { 16 17 } else if (id == R.id.common_item2) { 18 19 } else if (id == R.id.common_item3) { 20 //common_item1と同じ処理 21 } else if (id == R.id.common_item4) { 22 //common_item2と同じ処理 23 } 24 25 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 26 drawer.closeDrawer(GravityCompat.START); 27 return true; 28 }

試したこと

xmlのほうでダメ元でincludeを使ってみましたがダメでした。
また処理は当然別メソッドで記述、switch文なども試してみましたがどうしても冗長になってしまいます。
そもそも今のやり方では、idが一意である以上この分岐を避けられないです。

補足情報(FW/ツールのバージョンなど)

APIレベル22でやっています。

kakajika👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

xml上でのincludeはできませんが、プログラム上なら似たようなことが実現可能です。
以下のようにmenuリソースを用意したとして、

  • menu1.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<menu 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 tools:showIn="navigation_view"> 6 7 <group android:checkableBehavior="single"> 8 <item 9 android:id="@+id/item1" 10 android:icon="@drawable/..." 11 android:title="ItemA" /> 12 <item 13 android:id="@+id/item2" 14 android:icon="@drawable/..." 15 android:title="ItemB" /> 16 </group> 17 18 <item 19 android:id="@+id/common_menu" 20 android:title="Commons"> 21 <menu /> 22 </item> 23</menu>
  • common_menu.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<menu xmlns:android="http://schemas.android.com/apk/res/android"> 3 <item 4 android:id="@+id/common_item1" 5 android:icon="@drawable/..." 6 android:title="CommonItemA" /> 7 <item 8 android:id="@+id/common_item2" 9 android:icon="@drawable/..." 10 android:title="CommonItemB" /> 11</menu>

プログラム側で以下のように実装すれば、 R.id.common_menu のところのサブメニューに R.menu_common_menu の内容を読み込むことができます。

java

1@Override 2public boolean onCreateOptionsMenu(Menu menu) { 3 MenuInflater inflater = getMenuInflater(); 4 // menuにR.menu.menu1の内容を読み込む 5 inflater.inflate(R.menu.menu1, menu); 6 // menu内のR.id.common_menuのサブメニューにR.menu.common_menuの内容を読み込む 7 inflater.inflate(R.menu.common_menu, menu.findItem(R.id.common_menu).getSubMenu()); 8 return super.onCreateOptionsMenu(menu); 9}

投稿2018/09/24 09:55

編集2018/09/24 09:59
kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shal0ne

2018/09/24 19:35

回答ありがとうございます。 Infraterを使って動的にmenuを自作するのですね。 Inflaterを使いこなせれば色々できそうなのでもう少し詳しく調べてみようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問