2011-06-11 31 views
1

我需要建立一系列的對象,它只是看起來醜陋現在:這可以做得更容易嗎? Java初學者的問題

CheckBox checkOne = (CheckBox) findViewById(R.id.checkOne); 
CheckBox checkTwo = (CheckBox) findViewById(R.id.checkTwo; 
CheckBox checkThree = (CheckBox) findViewById(R.id.checkThree); 
CheckBox checkFour = (CheckBox) findViewById(R.id.checkFour); 
CheckBox checkFive = (CheckBox) findViewById(R.id.checkFive); 

我在中間水平,當談到Java,所以我想要做的是做一個for循環,然後使用變量變量。唉,Java不支持這一點。有沒有更少的遞歸方式來做到這一點?

+1

我在兩個頭腦是否是從這個問題中刪除'java'標籤,因爲你遇到的問題是Android特定的,而不是Java。 @Don Roby的代碼在他的回答中是最接近你想要做的。 – Squonk 2011-06-11 19:39:23

回答

5

假定查找鍵是整數,你可以這樣說:

CheckBox[] boxes = new CheckBox[5]; 
int[] ids = new int[]{R.id.checkOne, R.id.checkTwo, R.id.checkThree, 
         R.id.checkFour, R.id.checkFive}; 

for (int i=0; i<5; i++) { 
    boxes[i] = (CheckBox) findViewById(ids[i]) 
} 

如果密鑰是別的東西,你當然需要改變ids陣列的類型。

而且,如果您可以控制R類中的這些按鍵的方式,那麼最好將它們製作爲數組。

您可能會更好使用列表而不是數組。

+0

「如果您可以控制這些按鍵在R類中的位置」 - Android中的「R」類是在構建時自動生成的。然而,你的代碼示例幾乎是OP需要做的。 +1 – Squonk 2011-06-11 19:45:52

+0

謝謝,這是我需要的 – 2011-06-11 20:29:38

3
CheckBox[] boxes = new CheckBox[]{(CheckBox) findViewById(R.id.checkOne), 
        (CheckBox) findViewById(R.id.checkTwo), ...}; 

可以初始化這樣或int陣列陣列和一個迭代循環for在這個陣列。

+0

感謝您的解決方案,但這看起來同樣醜陋。那麼'for'循環將如何看待? – 2011-06-11 18:49:43

+0

我不知道,取決於你的用法。這看起來不會比名爲checkOne,checkTwo的參數更醜陋。假設你想要隱藏所有的複選框,那麼'for(CheckBox c:boxes){c.setVisibility(false);}' 'checkOne.setVisiblity(假); checkTwo.setVisiblity(假); ...' – 2011-06-11 19:00:55

1

如果checkOne,checkTwo等是R.id上的字段,那麼迭代它們的唯一方法是使用反射。這並不完美,但這是你必須在java中處理這個問題的方式。

List<CheckBox> boxes = new ArrayList<CheckBox>(); 
    for(Field f : R.id.getClass().getFields()) { 
     if(f.getName().startsWith("check")) { 
      boxes.add((CheckBox) findViewById(f.get(R.id))); 
     } 
    } 
0

如果希望通過ID名字符串變量,以獲得相應的複選框,然後命名複選框checkbox1checkbox2等,並訪問他們這樣說:

String view_name = ""; 
CheckBox[] boxes = new CheckBox[5]; 
Integer x=0, y; 
for (x=0;x<5;x++){ 
    y=x+1; 
    view_name = "checkbox"+ y.toString(); 
    boxes[x] = (CheckBox) findViewById(getResources().getIdentifier(view_name,"id", getPackageName())); 
}