Shane
Shane

Reputation: 2375

Easy way to setOnClickListener() on all Activity Buttons

New to android development, but not entirely new to Java. Right now my code inside the onCreate() method is quite basic:

    Button b1 = (Button) findViewById(R.id.button1);
    Button b2 = (Button) findViewById(R.id.button2);
    Button b3 = (Button) findViewById(R.id.button3);
    Button b4 = (Button) findViewById(R.id.button4);
    Button b5 = (Button) findViewById(R.id.button5);
    Button b6 = (Button) findViewById(R.id.button6);
    Button b7 = (Button) findViewById(R.id.button7);
    Button b8 = (Button) findViewById(R.id.button8);
    Button b9 = (Button) findViewById(R.id.button9);
    Button b10 = (Button) findViewById(R.id.button10);
    Button b11 = (Button) findViewById(R.id.button11);
    Button b12 = (Button) findViewById(R.id.button12);
    Button b13 = (Button) findViewById(R.id.button13);
    Button b14 = (Button) findViewById(R.id.button14);
    Button b15 = (Button) findViewById(R.id.button15);
    Button sqrt = (Button) findViewById(R.id.button16);
    Button b17 = (Button) findViewById(R.id.button17);
    Button b18 = (Button) findViewById(R.id.button18);
    Button b19 = (Button) findViewById(R.id.button19);
    Button b20 = (Button) findViewById(R.id.button20);
    b1.setOnClickListener(this);
    b2.setOnClickListener(this);
    b3.setOnClickListener(this);
    b4.setOnClickListener(this);
    b5.setOnClickListener(this);
    b6.setOnClickListener(this);
    b7.setOnClickListener(this);
    b8.setOnClickListener(this);
    b9.setOnClickListener(this);
    b10.setOnClickListener(this);
    b11.setOnClickListener(this);
    b12.setOnClickListener(this);
    b13.setOnClickListener(this);
    b14.setOnClickListener(this);
    b15.setOnClickListener(this);
    sqrt.setOnClickListener(this);
    b17.setOnClickListener(this);
    b18.setOnClickListener(this);
    b19.setOnClickListener(this);
    b20.setOnClickListener(this);

Surely there is an easier way than this. I attempted a simple for loop, but the id values of the buttons do not suit an increment of 'i'. Do I have to change the id values to make this method possible, or is there an easier way?

If it's relevant, I'm using the latest version of the Android SDK, plugin for Eclipse and the target version number is 2.3.3

Upvotes: 4

Views: 7578

Answers (4)

Mohammad Ersan
Mohammad Ersan

Reputation: 12444

in onCreate call get the root layout

ViewGroup rootLayout=(ViewGroup) findViewById(R.id.root_layout);

then pass it to this method, (using recursive for deep search for buttons)

public void setAllButtonListener(ViewGroup viewGroup) {

    View v;
    for (int i = 0; i < viewGroup.getChildCount(); i++) {
        v = viewGroup.getChildAt(i);
        if (v instanceof ViewGroup) {
            setAllButtonListener((ViewGroup) v);
        } else if (v instanceof Button) {
            ((Button) v).setOnClickListener(myButtonsListener);
        }
    }
}

good luck

Upvotes: 10

Kevin Coppock
Kevin Coppock

Reputation: 134704

Just a fun trick for you, since all your buttons are using the same listener, you could do something like this with less code (though it's less efficient, not likely to be noticeable though):

ViewGroup group = (ViewGroup)findViewById(R.id.myrootlayout);
View v;
for(int i = 0; i < group.getChildCount(); i++) {
    v = group.getChildAt(i);
    if(v instanceof Button) v.setOnClickListener(this)
}

Upvotes: 15

Amandeep Grewal
Amandeep Grewal

Reputation: 1821

Something a little less repetitive could be:

int[] ids = {R.id.button1, R.id.button2, ... };
for (int id:ids) {
    Button b = (Button) findViewById(id);
    b.setOnClickListener(this);
}

Upvotes: 0

MByD
MByD

Reputation: 137382

Create an array of buttons and do it in a loop:

int[] ids = { R.id.button1, R.id.button2 , ........... };
Button[] buttons = new Buttons[ids.length];

for (int i = 0; i < ids.length; ++i) {
    buttons[i] = (Button)findViewByIf(ids[i]);
    buttons[i].setOnClickListener(this);
}

Upvotes: 2

Related Questions