动态创建按钮并设置onClickListener

Ant*_*nte 27 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);
Run Code Online (Sandbox Code Playgroud)

目前我正在为每个按钮添加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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

这对我来说不太好看,所以我想问有没有更好的方法呢?或者如何向onclick事件发送一些信息?有什么建议?

Man*_*ser 63

您可以创建一个返回onclickListener并将按钮作为参数的方法.然后使用该方法在您拥有的第一个循环中设置onClicklistener.

更新:代码可能是这样的:

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

作为活动中的一个方法,然后像这样在循环中使用它

button.setOnClickListener(getOnClickDoSomething(button));
Run Code Online (Sandbox Code Playgroud)

  • 我建议首先实现干净,可维护和可读的代码,然后在发现性能问题时进行优化.不是相反.除非你的数字是疯狂的高,否则我认为它不会显着.即使您发现问题,您仍然可以首先优化方法...例如,从缓存中返回侦听器等等. (5认同)

小智 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]));

}
Run Code Online (Sandbox Code Playgroud)

在onCreate之后创建一个返回类型View.OnClickListener的方法,就像这样..

View.OnClickListener handleOnClick(final Button button) {
    return new View.OnClickListener() {
        public void onClick(View v) {
        }
    };
}
Run Code Online (Sandbox Code Playgroud)


Vic*_*cky 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();  
    }

};
Run Code Online (Sandbox Code Playgroud)

通过调用此侦听器 btn.setOnClickListener(btnclick);