2011-08-13 34 views
2

对于开发人员来说是新手,但对于Java来说并不是全新的。现在我的onCreate()方法中的代码非常简单:在所有活动按钮上轻松设置setOnClickListener()

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

当然还有比这更简单的方法。我尝试了一个简单的for循环,但按钮的id值不适合“i”的增量。我是否必须更改id值才能使此方法可行,还是有更简单的方法?

如果是相关的,我使用的和最新版本的Android SDK的,Eclipse插件目标版本号是2.3.3

+1

你也可以为你的l设置这在xml文件ayout通过为每个按钮指定android:onClick。 –

回答

13

只是一个有趣的把戏给你,因为你所有的按钮都使用相同的监听器,你可以做这样的事情较少代码(虽然它的效率较低,不太可能是明显的,虽然):

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) 
} 
+0

多数民众赞成的方式应该(重拳出击) –

+1

简单而美丽。 – DallaRosa

+0

很酷,我从来没有听说过“instanceof”关键字直到现在=) – Emiam

1

创建按钮的数组,并做一个循环:

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); 
} 
+0

完美,谢谢 – Shane

+0

您可以使用您创建的'ids'数组来引用它,并且'findViewById' – MByD

+0

这与您所做的一样,仅适用于数组和循环。 – MByD

0

东西少一些重复的可能是:

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

onCreate调用获取根布局

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

然后将它传递给这个方法,(使用递归的深搜索按钮)

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

好运

+0

忘记了递归搜索;很好的补充! – kcoppock

+1

这是最好的解决方案,因为它可以处理任何级别的递归。 –

相关问题