動的にボタンを作成し、設定onClickListener
-
25-09-2019 - |
質問
私は、Android上で動的に作成ボタンを取り扱いに問題があります。私は、Nボタンを作成していると私は、ボタンがクリックされたときと同じ方法をしなければならないが、私がクリックされたボタンを知っている必要があります。
for (int i = 0; i < NO_BUTTONS; i++){
Button btn = new Button(this);
btn.setId(2000+i);
...
btn.setOnClickListener((OnClickListener) this);
buttonList.addView(btn);
list.add(btn);
Cucurrently私はすべてのボタンにIDを追加していると私は、クリックされたボタンを確認するには、以下の方法を使用しています。 (ラインbtn.setId(2000+i);
とbtn.setOnClickListener((OnClickListener) this);
)。この方法はまた、活動に実装されています。
@Override
public void onClick(View v) {
switch (v.getId()){
case 2000: selectButton(0);
break;
...
case 2007: selectButton(7);
break;
}
}
私が求めているので、これは私には良い見ていないこれを行うには、いくつか良い方法はありますか?またはどのようonclickのイベントにいくつかの情報を送信するには?任意の提案ですか?
解決
あなたはonclickListenerを返し、パラメータとしてボタンを受け取るメソッドを作成することができます。そして、あなたが持っている最初のループでonClicklistenerを設定するには、そのメソッドを使用します..
更新:コードは、これらの線に沿ってsoemthingことができます:
View.OnClickListener getOnClickDoSomething(final Button button) {
return new View.OnClickListener() {
public void onClick(View v) {
button.setText("text now set.. ");
}
};
}
次いで、活性の方法としてと
このようなループ内で使用button.setOnClickListener(getOnClickDoSomething(button));
他のヒント
私は、このための一つの解を得ました。.. onCreate
でこのコードを使用しますlinear = (LinearLayout) findViewById(R.id.linear);
LayoutParams param = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f);
Button[] btn = new Button[num_array_name.length];
for (int i = 0; i < num_array_name.length; i++) {
btn[i] = new Button(getApplicationContext());
btn[i].setText(num_array_name[i].toString());
btn[i].setTextColor(Color.parseColor("#000000"));
btn[i].setTextSize(20);
btn[i].setHeight(100);
btn[i].setLayoutParams(param);
btn[i].setPadding(15, 5, 15, 5);
linear.addView(btn[i]);
btn[i].setOnClickListener(handleOnClick(btn[i]));
}
のonCreateは次のように戻り値の型View.OnClickListenerする1つの方法を作成した後..
View.OnClickListener handleOnClick(final Button button) {
return new View.OnClickListener() {
public void onClick(View v) {
}
};
}
Button.OnClickListener btnclick = new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Button button = (Button)v;
Toast.makeText(getApplicationContext(), button.getText().toString(),2).show();
}
};
btn.setOnClickListener(btnclick);
このビューのIDは、これらの目的のために使用すべきではありません
ただ、(ボタンがそれらを継承するので)ビューレベルで入手可能ですsetTag()メソッドで独自のIDを配置します。この「タグ」は、あなたが他の人からの眺めを認識することができます何もすることができます。あなたはのgetTag()とその値を取得します。
の代わりに容易に明確にsetTag()関数を使用します。
for(int i=0;i<4;i++) {
Button btn = new Button(this);
btn.setTag(i);
btn.setOnClickListener(new View.OnclickListener() {
@Override
public void onClick(View v) {
int i=v.getTag();
switch(i) {
case 1: btn.setText(i);
break;
case 2: btn.setText(i);
break;
case 3: btn.setText(i);
break;
case 4: btn.setText(i);
break;
default: btn.setText("Others");
}
}
}
「これは私には良い見ていない」理由は?それは動作しませんか?また、すべての追加ボタンのリストを保持している静的メンバ変数を作成し、代わりにそのリストの中クリックされたボタンを探してください可能性があります。
私はあなたがすべての(I平均にそれらのすべてに適合一度にそれらを表示しようとしていない場合はNのあなたの値は、少なくとも10以上であるように見え、知りません1つの画面、無スクロール)あなたはリストビューホルダーを使用してリストビューのために私たちは同じように見えないボタンを再利用しようとすることができます。これはあなたのメモリフットプリントとブーストのパフォーマンスが低下し、あなたがそれらに設定されたテキストやタグのいずれかに基づいてボタンを区別するか、あなたもボタンのものを少数への参照を保持することができます。
ない、setTagとのgetTagメソッドは、その目的のために設計されたIDを持つ台無しに、それが迅速かつダイナミックなレイアウト
のボタンリスナーの束を設定するためのクリーンな方法だが望ましいですこの答えは、あなたは助けることがあります。 https://stackoverflow.com/a/5291891/2804001 の
public class MainActivity extends Activity implements View.OnClickListener
{
LinearLayout linearLayout;
Button [] button;
View.OnClickListener listener;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout=(LinearLayout)findViewById(R.id.parent_lay);
String[] array={"U123","U124","U125"};
int length=array.length;
System.out.println("11111111111111111111111111");
button=new Button[length];
for(int i=0;i<length;i++)
{
button[i]=new Button(getApplicationContext());
button[i].setId(i);
button[i].setText("User" + i);
button[i].setOnClickListener(this);
linearLayout.addView(button[i]);
}
}
@Override
public void onClick(View view)
{
view.getId();
Button button=(Button)findViewById(view.getId());
button.setText("Changed");
}
}