Dynamically creating Buttons and setting onClickListener

50,136

Solution 1

You could create a method that returns an onclickListener and takes a button as a parameter. And then use that method to set the onClicklistener in the first loop you have..

Update: code could be soemthing along these lines:

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

as a method in the activity and then use it in the loop like this

button.setOnClickListener(getOnClickDoSomething(button));

Solution 2

I got one solution for this.. use this code in 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]));

}

after onCreate create one method of return type View.OnClickListener like this..

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

Solution 3

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

};

call this listener by btn.setOnClickListener(btnclick);

Solution 4

View IDs should not be used for these purposes as View Ids are generated on compilation time depending on IDs defined in xml layout files.

Just place your own IDs in the setTag() method which is available at the View level (so Buttons inherit them). This "tag" can be anything that allow you to recognize a View from others. You retrieve its value with getTag().

Solution 5

instead use setTag() function to distinct easily.

 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");
             }
         }
     }
Share:
50,136
Ante
Author by

Ante

Updated on July 09, 2022

Comments

  • Ante
    Ante almost 2 years

    I have problem with handling dynamically created Buttons on Android. I'm creating N buttons and I have to do the same method when button is clicked but I have to know which button is clicked.

    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 I'm adding ID to every button and I'm using the method below to see which button was clicked. (line btn.setId(2000+i); and btn.setOnClickListener((OnClickListener) this);). This method is also implemented in the activity.

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case 2000: selectButton(0);
            break;
    
            ...
    
            case 2007: selectButton(7);
            break;
        }
     }
    

    This doesn't look good to me so i'm asking is there some better way to do this? or how to send some information to onclick event? any suggestions?