Search code examples
javaandroidandroid-layoutonclicklistener

How to manage OnClickListener on multiples buttons automatically created


I have a lot of Buttons that I've created programatically, each button corresponds to a certain action, and I need to be able to identify and retrieve the user input based on which button was clicked. The UI is as follow:

enter image description here

I have like 70 items like those ones.

I've read

Dynamically creating Buttons and setting onClickListener

and

Implementing OnClickListener for dynamically created buttons in Android

But I do not know what is the correct approach. For example, if the user clicks in the Button Text is now set..., I have to be able to retrieve the value of the EditText, and know that this amount of minutes corresponds with Andar carrito compra.

Would be correct to assign a tag to the Button, in order to identify the index on the screen, and then go up in the View hierarchy and retrieve the EditText Value?

This is my code so far:

for (int i = 1; i < types.length; i++) {

        //  ... more views created
        // ...... 

        Button enterBt2 = new Button(this);
        // Set layout params and stuff for the button
        enterBt2.setTag(i);
        enterBt2.setOnClickListener(getOnClickDoSomething(enterBt2));
        // ....
}

And the OnClickListener:

View.OnClickListener getOnClickDoSomething(final Button button)  {
    return new View.OnClickListener() {
        public void onClick(View v) {
            Log.e(TAG, "O " + ExerciseRecord.TYPE.values()[((int) button.getTag())]);
            // Obtain the value of the EditText with
            LinearLayout ll = (LinearLayout) button.getParent();
            ll.getChildAt(0); //The EditText
        }
    };
}

Would this be the best way to it?


Solution

  • Would be correct to assign a tag to the Button, in order to identify the index on the screen, and then go up in the View hierarchy and retrieve the EditText Value?

    It is an option. Or you could have a class that implements the interface, adding a constructor with takes a String as parameter. Eg.

    public class MyOnClickListener implements View.OnClickListener {
        final String mValue;
        public MyOnClickListener(String value) {
               mValue = value;
        }
    
         public void onClick(View v) {
            Log.e(TAG, "O " + mValue);
            // Obtain the value of the EditText with button.getParent()....
         }
    }