web-dev-qa-db-ja.com

ボタンの動的な作成とonClickListenerの設定

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);
_

現在、すべてのボタンに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イベントに情報を送信する方法は?助言がありますか?

27
Ante

OnclickListenerを返し、ボタンをパラメーターとして使用するメソッドを作成できます。そして、そのメソッドを使用して、最初のループでonClicklistenerを設定します。

更新:コードはこれらの行に沿って気味が悪いかもしれません:

View.OnClickListener getOnClickDoSomething(final Button button)  {
    return new View.OnClickListener() {
        public void onClick(View v) {
            button.setText("text now set.. ");    
        }
    };
}

アクティビティのメソッドとして、このようにループで使用します

button.setOnClickListener(getOnClickDoSomething(button));
63
Manfred Moser

私はこれのための1つの解決策を得た.. 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) {
        }
    };
}
12
_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);でこのリスナーを呼び出します

5
Vicky

ビューIDは、xmlレイアウトファイルで定義されたIDに応じてコンパイル時に生成されるため、これらの目的には使用しないでください。

ビューレベルで使用可能なsetTag()メソッドに独自のIDを配置するだけです(したがって、ボタンはそれらを継承します)。この「タグ」は、他のユーザーからのビューを認識できるものであれば何でもかまいません。 getTag()で値を取得します。

3
Kevin Gaudin

代わりに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");
             }
         }
     }
1
Siva Chegondi
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");
}
}
0
Newbee

Ids、setTag、およびgetTagメソッドを混乱させないようにすることは、その目的のために設計された方が望ましいです。動的レイアウト上に多数のボタンリスナーを設定するための高速でクリーンな方法です。

この答えはあなたを助けるかもしれません: https://stackoverflow.com/a/5291891/2804001

0

「これは私には似合わない」なぜですか?うまくいかない?追加されたすべてのボタンのリストを保持する静的メンバー変数を作成し、代わりにそのリストでクリックされたボタンを探すこともできます。

0
fabio

N個のボタンを作成する理由がわかりません。一度にすべてを表示しようとしていない場合、Nの値は少なくとも10より大きいようです(すべてのボタンを1つの画面に収めることを意味します) 、スクロールなし)リストビューホルダーを使用してリストビューの場合と同じように、非表示ボタンをリサイクルすることができます。これにより、メモリフットプリントが削減され、パフォーマンスが向上します。また、ボタンに設定したテキストまたはタグに基づいてボタンを区別するか、これらの少数のボタンへの参照を保持することもできます。

0
srinathhs