我有一个有效的应用程序,但想要优化代码。下面是一个示例,我创建了10个单独的图像按钮(注意每个图像按钮的递增对象名和XML参考)并设置它们的监听器。任何人都可以建议一个更优化的方法,也许在动态方法/循环中吗?感谢....
private void initialiseButtons() {
ImageButton imageButton1 = (ImageButton)this.findViewById(R.id.imageButton1);
imageButton1.setOnClickListener(this);
ImageButton imageButton2 = (ImageButton)this.findViewById(R.id.imageButton2);
imageButton2.setOnClickListener(this);
ImageButton imageButton3 = (ImageButton)this.findViewById(R.id.imageButton3);
imageButton3.setOnClickListener(this);
ImageButton imageButton4 = (ImageButton)this.findViewById(R.id.imageButton4);
imageButton4.setOnClickListener(this);
ImageButton imageButton5 = (ImageButton)this.findViewById(R.id.imageButton5);
imageButton5.setOnClickListener(this);
ImageButton imageButton6 = (ImageButton)this.findViewById(R.id.imageButton6);
imageButton6.setOnClickListener(this);
ImageButton imageButton7 = (ImageButton)this.findViewById(R.id.imageButton7);
imageButton7.setOnClickListener(this);
ImageButton imageButton8 = (ImageButton)this.findViewById(R.id.imageButton8);
imageButton8.setOnClickListener(this);
ImageButton imageButton9 = (ImageButton)this.findViewById(R.id.imageButton9);
imageButton9.setOnClickListener(this);
ImageButton imageButton0 = (ImageButton)this.findViewById(R.id.imageButton0);
imageButton0.setOnClickListener(this);
}
答案 0 :(得分:1)
您可以使用http://androidannotations.org/来减少样板代码,这样就可以进行类似的操作了
@ViewById
ImageButton imageButton1;
但是使用数组或按钮列表而不是多个引用可能更好,例如:
private void init() {
int[] ids=new int[]{R.id.imageButton1, R.id.imageButton2 ...};
List<ImageButton> buttons=new ArrayList<ImageButton>;
for(int id : ids) {
buttons.add((ImageButton)this.findViewById(id));
}
}
然后您可以轻松地在List上进行迭代,例如设置侦听器
for(ImageButton button : buttons) {
button.setOnClickListener(this);
}
答案 1 :(得分:1)
您可以使用循环并使用getIdentifier()
方法。
int idToInitialize;
ImageButton ib;
for (int i = 0; i < 9; i++) {
idToInitialize = getResources().getIdentifier("imageButton" + i, "id", getPackageName());
ib = (ImageButton) this.findViewById(idToInitialize);
ib.setOnClickListener(this);
}
Hovewer,如果我们将其与普通方法进行比较,那就非常慢了。
答案 2 :(得分:0)
我无法尝试,因为我这里没有Android环境。但我认为这应该有效:
private void initialiseButtons() {
for(int i = 0; i < 10; i++) {
ImageButton imageButton = (ImageButton)this.findViewById(R.id.getClass().
getField("imageButton" + i).get(R.id));
imageButton.setOnClickListener(this);
}
}
答案 3 :(得分:0)
您可以使用数组,列表......
例如:
private static final int[] BUTTONS_IDS = new int[] {R.id.imageButton0, R.id.imageButton1, R.id.imageButton2, R.id.imageButton3, R.id.imageButton4, R.id.imageButton5, R.id.imageButton6, R.id.imageButton7, R.id.imageButton8, R.id.imageButton9};
ImageButton[] buttons = new ImageButton[BUTTON_IDS.length];
private void initialiseButtons() {
for (int i = 0; i < BUTTONS_IDS.length; i++) {
buttons[i] = (ImageButton) findViewById(BUTTONS_IDS[i]);
buttons[i].setOnClickListener(this);
}
}
您还可以将id列表放在arrays.xml文件中。
答案 4 :(得分:0)
如果仅用于设置onClickListener
,您可以摆脱整个initialiseButtons()
方法,只需在布局xml中添加android:onClick="handleButtonClick"
,并在您的活动中定义该方法,如下所示:
public void handleButtonClick(View view) {
switch(view.getId()) {
case R.id.imageButton1: // handle button 1 pressed ....
case R.id.imageButton2: // handle button 2 pressed ....
// ... handle further buttons
}
}