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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Q&A

1回答

1540閲覧

動的にメニューボタンを追加する

syosinsya109

総合スコア41

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

0グッド

0クリップ

投稿2023/01/05 11:08

編集2023/01/05 13:56

前提

androidについて質問します。
menuを動的に項目を追加しようと思っています。
例えば、メインのボタンを押すとボタンを押された回数だけメニューボタンを追加したいと考えています。
しかし、調べてみると表示するメニューバーをif文で切り替えるみたいなやり方しかなく、そうしてしまうと、ボタンを100回押された場合に100個のmenuレイアウトファイルを作成しなければなりません。
プログラムから動的にメニューボタンをセットするにはどのようにしたらいいのでしょうか。
また、追加されたメニューボタンを押した際にもアクションを起こせるようにしたいです。

実現したいこと

動的にオプションボタンを追加する

該当のソースコード

枠組みだけですが。。

MainActivity.java

1import android.os.Bundle; 2import android.view.Menu; 3import android.view.MenuItem; 4 5import androidx.appcompat.app.AppCompatActivity; 6 7public class MainActivity extends AppCompatActivity { 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 12 } 13 14 15 @Override 16 public boolean onCreateOptionsMenu(Menu menu) { 17 getMenuInflater().inflate(R.menu.option, menu); 18 return super.onCreateOptionsMenu(menu); 19 } 20 21 // メニューが選択されたときの処理 22 @Override 23 public boolean onOptionsItemSelected(MenuItem item) { 24 switch (item.getItemId()) { 25 default: 26 return super.onOptionsItemSelected(item); 27 } 28 } 29}

activity_main.xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 10 <Button 11 android:id="@+id/button" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="オプションボタンを追加" 15 app:layout_constraintStart_toStartOf="parent" 16 app:layout_constraintTop_toTopOf="parent" /> 17</androidx.constraintlayout.widget.ConstraintLayout>

option.xml

1<?xml version="1.0" encoding="utf-8"?> 2<menu xmlns:android="http://schemas.android.com/apk/res/android"> 3 4</menu>

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

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

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

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

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

syosinsya109

2023/01/05 15:48

ありがとうございます。 調べてみると、menu.addSubMenuでグループ化でき、menu.addで一つ一つのメニューが作成できるみたいです。 また、menu.addSubMenu(0,nId++,Menu.NONE,"ccc").add(0,nId++,Menu.NONE,"ddd");とすると、グループ化した要素に追加できることがわかりました。 しかし、menu.addSubMenu(0,nId++,Menu.NONE,"ccc").add(0,nId++,Menu.NONE,"ddd");には、新たにaddが繋げられなくて、グループに1つの要素しか追加できません。2つ以上追加するにはどのようにしたらいいのでしょうか。 また、完全に動的にしたいと思っていて、ボタンが押された場合にfor分等で回してmenuを組み立てたいと思っているのですが、そういうことは可能でしょうか。
hoshi-takanori

2023/01/05 16:55

menu.addSubMenu() の結果を変数に入れて、そこに add すれば良いかと。 また、メニューを再生成する際にはたぶん全部作り直すことになると思いますが、過去に追加した分も覚えておいて、for で回せば良いのでは…。
jimbe

2023/01/05 17:32 編集

メニュー内の要素はボタン(Button)では無く MenuItem ですので、"メニューボタン"を"メニューアイテム"、もしくは単に"メニュー"等と表現されると良いのかもしれません。 (メニューを表示するためのボタンを"メニューボタン"という時がありますので、それと間違え易いです。)
guest

回答1

0

メニュー構造をどうされたいのかは分かりませんが、全部作るなら menu の xml は要りません。

java

1import androidx.annotation.NonNull; 2import androidx.appcompat.app.AppCompatActivity; 3import androidx.core.view.MenuProvider; 4 5import android.os.Bundle; 6import android.view.*; 7import android.widget.*; 8 9import java.util.*; 10 11public class MainActivity extends AppCompatActivity { 12 13 private class MyMenuProvider implements MenuProvider { 14 private static final int SUBMENU_MAX = 10; 15 private List<String> menuTextList = new ArrayList<>(); 16 void addMenu() { 17 menuTextList.add("Menu "+(menuTextList.size()+1)); 18 invalidateMenu(); 19 } 20 @Override 21 public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) { 22 int i = 0; 23 for(int j=0; j<menuTextList.size()/SUBMENU_MAX; j++) { 24 SubMenu subMenu = menu.addSubMenu("SubMenu "+(j+1)); 25 for(int k=0; k<SUBMENU_MAX; k++) subMenu.add(menuTextList.get(i++)); 26 } 27 while(i<menuTextList.size()) menu.add(menuTextList.get(i++)); 28 } 29 @Override 30 public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { 31 Toast.makeText(MainActivity.this, menuItem.getTitle(), Toast.LENGTH_SHORT).show(); 32 return true; 33 } 34 } 35 36 @Override 37 protected void onCreate(Bundle savedInstanceState) { 38 super.onCreate(savedInstanceState); 39 setContentView(R.layout.activity_main); 40 41 MyMenuProvider menuProvider = new MyMenuProvider(); 42 addMenuProvider(menuProvider); 43 44 Button button = findViewById(R.id.button); 45 button.setOnClickListener(v -> menuProvider.addMenu()); 46 } 47}

投稿2023/01/05 17:47

編集2023/01/06 08:55
jimbe

総合スコア12632

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

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

syosinsya109

2023/01/06 05:00

回答ありがとうございます。 複数回ボタンを押すと、メニューをスクロールしなければいけなくて面倒なので、10回クリックするたびにサブメニューに追加したいと考えているのですが、そういうことって可能でしょうか。 addSubMenuでできるようなのですが、addが1つしか追加できなくて、複数個追加できなくて困っています。
jimbe

2023/01/06 08:43

質問へのコメントで hoshi-takanori さんが書かれています通り、 リンク先のaddSubMenu のコードは単に 1 件だけ add する為に "." で繋げて書いているだけで、分けて変数を介して操作するようにすれば良いでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問