動的に作成したボタン配列をクリックしたときにその配列番号を返すには?

7,260 views
Skip to first unread message

K.Asano

unread,
Oct 3, 2011, 4:53:39 AM10/3/11
to 日本Androidの会 新潟支部
淺野です。以下のように動的にボタンを作成した場合にbutton[array].setOnClickListenerから
onClick(View view)でのクリックは同じになってしまいます。arrayは最終的に5になることとなどは全て理解できるのですが、どの
ような考えとコーディングでボタンの配列に対応した番号を取得したらいいのか分かりません。このコーディングではToastではき出せば5が帰りま
す。
多分、このような質問は多々あるのでは無いかと思いますが、私には現段階で考えつきませんので、ご教授をお願い申し上げます。


AutoButtonActivity.java

package ftptest_002.syakazuka.com;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Toast;

public class AutoButtonActivity extends Activity{
LinearLayout linearLayout;
private int array;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.autobutton);
ScrollView scr_view = (ScrollView)findViewById(R.id.s_view);
int max=5;
Button button[] =new Button[max];
int height = (ScreenHeigth()-100)/max;
int width = (ScreenWidth()-100)/max;
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(ll.VERTICAL);

for(array=0;array<max;array++){

button[array] = new Button(this);
button[array].setText("ボタン["+ array + "]");
button[array].setHeight(height);
button[array].setWidth(width);


button[array].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view){
//Intent intent = new
Intent(ButtonListSample.this, Next.class);
//Log.v("","");
//startActivity(intent);
Toast.makeText(AutoButtonActivity.this,"Number =" +
array ,Toast.LENGTH_SHORT).show();

}
});

ll.addView(button[array]);

}
s_view.addView(ll);
}

private int ScreenWidth(){
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = wm.getDefaultDisplay();
int w = disp.getWidth();

return (w);
}
private int ScreenHeigth(){
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = wm.getDefaultDisplay();
int w = disp.getHeight();

return (w);
}
private LinearLayout.LayoutParams createParam(){
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = wm.getDefaultDisplay();
int w = disp.getWidth();
int h = disp.getHeight() / 2;

return new LinearLayout.LayoutParams(w, h);
}

}



autobutton.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ScrollView
android:id="@+id/s_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
/>
</LinearLayout>

Don

unread,
Oct 3, 2011, 8:54:57 AM10/3/11
to android-gr...@googlegroups.com
こういうことがしたいのかなぁ?

button作成時に
button[array].setTag(String.valueof(array));


onClick(View view)の中で
String arrayIndexString = view.getTag();
int index = Integer.valueOf(arrayIndexString).intValue();
or
int index = Integer.parseInt(arrayIndexString);

はて?

K.Asano

unread,
Oct 3, 2011, 9:56:29 AM10/3/11
to 日本Androidの会 新潟支部
ええ、出来ました。この答えが分からなかったのです。
どうでもいいことですが、
String arrayIndexDString = view.getTag().toString();
でした。
setTagって知らなかった。
と、言うより、6月から初めてjavaやandroidをやり始めたばかりなので、すそ野の知識は全くないのです。
すっごく助かりました。
実は、タイトルと実行パラメーターを利用し、固定的FTPクライアントを作りたかったのです。FTPクライアントの種類は可変なのと、それが、大きなボ
タンでTabletで表現することにより、間違いが少なくなると思えるからです。この可変ボタンは同じく、僅かな仕事に有効に働きます。母が高齢で体が
不自由で、ボタンを押す力もなく、タッチするだけで、介護のメッセージが発信出来る仕組みにも役立ちます。従来は母の介護用では幾つかのソフトをウイン
ドウズでは作りましたが、tabletではandroidが実用的と思いました。
私の幾つかの今後のプログラムではこの配列は欠かせませんでした。実現出来て、感謝申し上げます。
今後とも、抱えている問題がありますので、この場で質問させていただくことになるかと思いますが、お知恵を拝借させていただければ幸いです。
ありがとうございました。

Don

unread,
Oct 3, 2011, 10:07:59 AM10/3/11
to android-gr...@googlegroups.com
ああそうでしたね。
getTagはObjectを返すんだった。
少しはお役にたったようで
よかったわぁ。

K.Asano

unread,
Oct 3, 2011, 10:18:31 AM10/3/11
to 日本Androidの会 新潟支部
何度も言いますが、本当に感謝です。私はC屋でして、Unix系のサーバーばかりが多くて、色々な言語をいじってきていましたが、唯一と言っていいほど
逃していたのがJavaでした。もっとも、まつもとさんのもやっていませんし、最近はやりのスクリプト系はダメです。CGIではphpやperlといっ
たCライクなものになってしまいます。javaは私が必要としている範囲の全体像をつかむまで1年はかかりそうです。年だからと言い訳はすきではありま
せんので、チャレンジはしていきます。今後とも是非よろしくご指導ください。

On Oct 3, 11:07 pm, Don <tsuyoshi.with.l...@gmail.com> wrote:
> ああそうでしたね。
> getTagはObjectを返すんだった。
> 少しはお役にたったようで
> よかったわぁ。

Nkzn

unread,
Oct 3, 2011, 10:23:10 AM10/3/11
to android-gr...@googlegroups.com
ぐぬぬ、出遅れた。。。

LayoutInflaterを利用すると、ListViewの要素を動的に生成できそうだなあ、
(そしてListViewの1要素をButtonで埋めてしまえばあさいさんのと似たようなことができるなあ)
というところまで考えてたところでした。
時間があったらサンプル作れるかなあ。

K.Asano

unread,
Oct 3, 2011, 8:59:32 PM10/3/11
to 日本Androidの会 新潟支部
Nkznさん、実はListViewでは次の実現に難しい可能性があるのです。
Button生成についてとその配列番号が欲しかった大きな理由の一つは
ボタンの動的配置にあります。この考えはタブレットを前提にしています。下に例で示します。
最大9個までで、それ以上はスクロールで対処することになるでしょうし、現在のところ
それは不要かと思っております。あまり数が多い場合はListViewのItemでの処理で対処が
一般的なことと思っております。
一連の考えは頭のトレーニングや知識を得る為が主眼で、9個までであるなら、9個のxmlを
作成し、includeして切り替えるって事は最も簡単で実用的かもしれないと分かっているのですが、
一般化に向いていない事を考えれば、許せないことです。

-------------------------------------------------------------------------------------
例) ランドスケープの場合
-------------------------------------------------------------------------------------
配置に関する論理については別途関数化してあるものとして、以下のような配置を
動的に作成することが目的なのです。これについて、xmlではなく動的にレイアウトを
作成する方法を調べますが、分からない場合には、またご指導を仰ぎたいと存じております。
その際はあらためて、質問を立ち上げさせていただきます。


ボタン1個の場合
+--------------------+
| |
| |
| |
| |
| |
+--------------------+
ボタン2個の場合
+---------+----------+
| | |
| | |
| | |
| | |
| | |
+---------+----------+
ボタン3個の場合
+---------+----------+
| | |
| | |
+---------+ |
| | |
| | |
+---------+----------+
ボタン4個の場合
+---------+----------+
| | |
| | |
+---------+----------+
| | |
| | |
+---------+----------+

~
~
~
ボタン9個の場合
+------+------+------+
| | | |
+------+------+------+
| | | |
+------+------+------+
| | | |
+------+------+------+
Message has been deleted

yu kakizaki

unread,
Oct 4, 2011, 9:20:33 AM10/4/11
to 日本Androidの会 新潟支部

別の実装方法を。
次の場合に有効かなと思います。・forループでButtonを動的生成する・同じループ内でOnClickListenerを登録する
Buttonの生成個所を抜粋して、変更点を示します。
// ------------------------------------------------------------
for(array=0;array<max;array++) {
// ↓ (1) 追加 final int index = array;
button[array] = new Button(this); button[array].setText("ボタン["+
array + "]"); button[array].setHeight(height);
button[array].setWidth(width); button[array].setOnClickListener(new
View.OnClickListener() { @Override public void
onClick(View view){
// ↓ (2) arrayを参照していたが、indexへ変更
Toast.makeText(AutoButtonActivity.this,"Number =" +
index ,Toast.LENGTH_SHORT).show(); } });
ll.addView(button[array]);}
// ------------------------------------------------------------

変更点としては(1)ループ内で、finalな変数indexを定義し、arrayの値を代入。(2)OnClickListenerの実装から、
indexを参照。
finalとして変数を宣言した場合、それ以降の値の変更は許可されず、読み込みのみ可能な変数になります。finalなローカル変数であれば匿名クラ
ス(new View.OnClickListener)の実装部分から参照可能です。ループ毎にindexを宣言することで、各ボタンのリスナーは同
じループ内で宣言されたindexを参照します。
そのため、宣言時に代入された値(array)を各リスナーが把握できます。
いまいち説明が慣れませんが。。。文字を数値に変換する処理が必要なくなるので、簡素になるかと。

K.Asano

unread,
Oct 5, 2011, 7:59:52 PM10/5/11
to 日本Androidの会 新潟支部
私はjavaについて全く6月からなので、深く理解出来てはいませんが、前回より、明らかにエレガントな印象を受けます。よいプログラムはエレガントで
すよね。なおかつ、理解しやすい。
Cでプログラムを開発するとき、わかりにくいプログラムより、エレガントなものを財産としてきました。
若い時、つまらない理屈をつけて例え素晴らしい論理であっても、理解に時間のかかるものや、多言語の知識を必要とするものなどで、得意となっていた自分
がありました。
実証確認もいたしました。私のAndroid javaの重要な財産とさせていただきます。

余談ですが、このボタン機能を組込んだProgrammaticalなレイアウトを作成しています。LandScapeとPortraitに対応したも
のとして作成していますが、難しいLandScapeが完成したので、あと1時間ほどで、Portraitを作って、テストをいたします。

K.Asano

unread,
Oct 6, 2011, 3:20:57 AM10/6/11
to 日本Androidの会 新潟支部
自己レスです。

だいたい思ったような動きのするツールができました。
これはメニューインターフェイス部分を担当します。
動きをYoutubeにあげてみました。
基本的にはもっとブラッシュアップの必要があるかと思いますが、
ビジネス用を考えていますので、後は僅かな変更か、ボタンを
グラフィカルにするかぐらいで終了するつもりです。
ありがとうございました。


http://www.youtube.com/watch?v=pjiVDq6neRk

K.Asano

unread,
Oct 6, 2011, 4:19:21 AM10/6/11
to 日本Androidの会 新潟支部
またしても自己レスです。

どうでも良いことかもしれませんが、先ほどの動画(19秒)が短すぎたと友人からしかられたので、少しだけ長い動画(56秒)です。

http://www.youtube.com/watch?v=uHBWxOkfX_s

yu kakizaki

unread,
Oct 5, 2011, 12:04:23 AM10/5/11
to 日本Androidの会 新潟支部
ひどくインデントが乱れてしまったのでコードは以下を参照してください。

http://pastie.org/2641767

yu kakizaki

unread,
Oct 5, 2011, 9:18:50 PM10/5/11
to 日本Androidの会 新潟支部
onClickListenerの作成個所をメンバ関数として抜き出してやると少しわかりやすくなるような。。。

http://pastie.org/2647101


淺野和夫

unread,
Oct 9, 2011, 8:20:52 AM10/9/11
to android-gr...@googlegroups.com
確かに、これは遥に美しいですね。
ほとんど完成形みたいですね。

解説で手抜きページを作りましたが、android_layout_002.htmlを変更しなければねりませんね。

http://www.syakazuka.com/Myself/android/android_layout_001.html
http://www.syakazuka.com/Myself/android/android_layout_002.html

ソースを掲載してありますが、敬意を込めて「yu kakizaki」さんと「アンドロイドの会新潟支部」の表記をさせていただきました。


2011年10月6日10:18 yu kakizaki <y.kaki...@gmail.com>:
>
> onClickListenerの作成個所をメンバ関数として抜き出してやると少しわかりやすくなるような。。。
>
> http://pastie.org/2647101
>
>

Reply all
Reply to author
Forward
0 new messages