2

我有一个工作应用程序,但想优化代码。下面是一个示例,我创建了 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);
}
4

5 回答 5

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

然后您可以轻松地在列表上进行迭代,例如设置监听器

for(ImageButton button : buttons) {
   button.setOnClickListener(this);
}
于 2013-04-25T11:55:47.853 回答
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);
}

但是,如果我们与普通方法相比,它非常慢。

于 2013-04-25T12:08:08.410 回答
0

我无法尝试,因为我这里没有 Android Environmetn。但我认为这应该有效:

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);
   }
}
于 2013-04-25T12:00:16.840 回答
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 文件中。

于 2013-04-25T12:02:25.670 回答
0

如果仅用于设置onClickListener,您可以摆脱整个initialiseButtons()方法,只需添加android:onClick="handleButtonClick"布局 xml 并在您的活动中定义该方法,如下所示:

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
    }
}
于 2013-04-25T12:38:23.597 回答