这可以更轻松吗? Java初学者问题

时间:2011-06-11 18:27:08

标签: java android

我需要创建一系列对象,它现在看起来很丑陋:

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不支持这个。是否有任何,更少递归的方式来做到这一点?

4 个答案:

答案 0 :(得分: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类中这些键的保存方式,那么最好将它们设置为数组。

使用Lists而不是数组也可能会更好。

答案 1 :(得分:3)

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

您可以初始化此类数组或int数组,并在此数组上迭代for循环。

答案 2 :(得分: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)));
        }
    }

答案 3 :(得分:0)

如果您希望通过id-name字符串变量获取复选框,请将复选框命名为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()));
}