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

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

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

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

Android

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

Q&A

解決済

1回答

4154閲覧

動的に追加したボタンを押下した際、どのボタンが押されたかを確認したい

PEDRO

総合スコア2

Java

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

Android

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

0グッド

0クリップ

投稿2020/09/18 08:51

前提・実現したいこと

Android Studio でアプリ作成を勉強しています。

動的に追加した複数のボタンのうち一つをタップすると、別のアクティビティに遷移する画面を作っています。
どのボタンを押しても同じアクティビティを開くのですが、押されたボタンによって違う画像を表示したいと考えてます。

発生している問題・エラーメッセージ

ネット情報を参考にJavaのボタンを追加した際にsetOnClickListener()をセットする、というのを試してるのですが、onClick(View v) の引数vからgetIdでリソースid取得しても-1が返ってきてしまいます(どのボタンでも同じです)。

該当のソースコード

(上部省略)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group_member);

// ------------ // LinearLayoutのネスト構造作成 // ------------ // ベースとなる既存のLinearLayout(一番の大枠)を取得 LinearLayout baseLayout = (LinearLayout)findViewById(R.id.groupBaseLayout); // 1.垂直方向のレイアウト LinearLayout memberLayout = new LinearLayout(this); memberLayout.setOrientation(LinearLayout.VERTICAL); int mem = 0; int j = 0; while (mem < membercnt){ // 2.横方向のレイアウトセット LinearLayout columnLayout = new LinearLayout(this); columnLayout.setOrientation(LinearLayout.HORIZONTAL); columnLayout.setGravity(Gravity.CENTER_HORIZONTAL); // 3.メンバーのイメージボタンは横最大3つまで for (j = 0; j < 3; j ++) { if (mem >= membercnt) { // continue; } else { // ImageButtonを追加 ImageButton imgBtn = new ImageButton(this); LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); buttonLayoutParams.height=250; buttonLayoutParams.width=250; imgBtn.setAdjustViewBounds(true); imgBtn.setLayoutParams(buttonLayoutParams); imgBtn.setBackground(drawable); // ★★★★★★★★動的ボタンにonClickイベントを付与したい★★★★ imgBtn.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Log.d("debug","★★-->" + ((ImageButton)v).getId()); // ここでputExtraなどで次画面に押下したボタンの情報を渡したい } } ); // ★★★★★★★★ ここまで ★★★ columnLayout.addView(imgBtn); // 表示割合は1 // 画像は調整なし // セット mem = mem + 1; } } memberLayout.addView(columnLayout); } baseLayout.addView(memberLayout); setContentView(baseLayout); }

試したこと

上記ソースの★で囲んだ箇所のように、setOnClickListener()を設定してみました。
エラーにはなりませんがgetId()は-1が返ってきます。よろしくお願いします。

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

【OS】Windows 10
【Android Studio】Ver 4.0.1
【言語】Java 1.8.0_261

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

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

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

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

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

guest

回答1

0

ベストアンサー

動的に生成したコンポーネントにはIDは割り当てられていません。そうしたコンポーネントに与えるIDを生成するためのViewCompat.generateViewId()というメソッドがあるので、これで得たIDをコンポーネントのsetId()メソッドで与えれば良いのではないでしょうか。

IDを保持しておくための配列を作成(ここでは例としてimageButtonId[])しておいて、

java

1 ImageButton imgBtn = new ImageButton(this); 2 imageButtonId[j] = ViewCompat.generateViewId(); 3 imgBtn.setId(imageButtonId[j]);

のようにすればいいのではないかと思います。


後で条件分岐することを考えたら、ループカウンターの変数jをそのままタグとして与えた方が処理しやすいのかな(配列変数だとswitch〜case文のcaseに与えられないですね)。setTag()メソッドを使って次のようにボタンにタグを与えるのも一つの方法でしょう。

java

1 ImageButton imgBtn = new ImageButton(this); 2 imgBtn.setTag(j);

それから、ImageButtonにセットするリスナーを下記のように実装してみてはどうでしょうか。前述のタグを使ってswitch文で振り分けるのであればこのような感じで記述できるでしょう。

java

1 View.OnClickListener imgBtnListenerImpl = new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 switch ((int) v.getTag()) { 5 case 0: 6 break; 7 8 case 1: 9 break; 10 11 case 2: 12 break; 13 } 14 } 15 };

このようにして作成した変数をimgBtn.setOnClickListener()の引数に与えれば、ループの度にnewせずとも、1つのオブジェクトで共通処理とすることができます。

java

1 // ★★★★★★★★動的ボタンにonClickイベントを付与したい★★★★ 2 imgBtn.setOnClickListener(imgBtnListenerImpl);

投稿2020/09/18 09:47

編集2020/09/18 14:48
keicha_hrs

総合スコア6768

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

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

PEDRO

2020/09/28 00:53

大変遅くなりまして、申し訳ありません。ようやく実現できました。 結果としましてはタグにて判定する方法が私のやりたいことにマッチしましたので利用しました。 この方法は他でも色々と応用が利きそうです。非常に有用な情報をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問