动态创建按钮并设置onClickListener

时间:2010-12-09 17:06:08

标签: android button android-widget android-layout

我在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事件发送一些信息?有什么建议吗?

9 个答案:

答案 0 :(得分:63)

您可以创建一个返回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));

答案 1 :(得分:12)

我有一个解决方案.. 在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的方法,就像这样..

View.OnClickListener handleOnClick(final Button button) {
    return new View.OnClickListener() {
        public void onClick(View v) {
        }
    };
}

答案 2 :(得分:5)

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

调用此侦听器

答案 3 :(得分:3)

视图ID不应用于这些目的,因为视图ID是在编译时生成的,具体取决于xml布局文件中定义的ID。

只需将自己的ID放在setTag()方法中,该方法在View级别可用(因此Buttons继承它们)。此“标记”可以是允许您从其他人识别视图的任何内容。您可以使用getTag()检索其值。

答案 4 :(得分:1)

而是使用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");
             }
         }
     }

答案 5 :(得分:0)

“这对我来说不好看”为什么不呢?不行吗?您还可以创建一个静态成员变量,其中包含所有添加按钮的列表,然后在该列表中查找单击的按钮。

答案 6 :(得分:0)

我不知道你为什么要创建N个按钮,看起来你的N值至少大于10,如果你不想一次显示它们(我的意思是将它们全部放入一个单独的屏幕,没有滚动)您可以尝试回收隐形按钮,就像我们使用列表视图持有者一样进行列表视图。这样可以减少内存占用并提高性能,并根据您在其上设置的文本或标签区分按钮,或者甚至可以保留对少量按钮的引用。

答案 7 :(得分:0)

最好不要搞砸id,setTag和getTag方法就是为此而设计的,它是在动态布局上设置一组按钮监听器的快速而干净的方法

这个答案可能对您有所帮助: https://stackoverflow.com/a/5291891/2804001

答案 8 :(得分:0)

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");
}
}