我知道,Java没有预处理器,因此java中的某些内容或多或少是不可能的。
是否真的有 NO 方法在循环中用动态名称填充这些数组? 我想要像:
for(int i=0;i<5;i++){
earnTvs[i]=(TextView) findViewById(R.id.INSERT_GREAT_TRICK_HERE("earn"+i+"Tv"));
}
而不是
earnTvs[0] = (TextView) findViewById(R.id.earn1Tv);
earnTvs[1] = (TextView) findViewById(R.id.earn2Tv);
earnTvs[2] = (TextView) findViewById(R.id.earn3Tv);
earnTvs[3] = (TextView) findViewById(R.id.earn4Tv);
earnTvs[4] = (TextView) findViewById(R.id.earn5Tv);
timeTvs[0] = (TextView) findViewById(R.id.time1Tv);
...
ownTvs[0] = (TextView) findViewById(R.id.own1Tv);
...
costTvs[0] = (TextView) findViewById(R.id.build1Tv);
...
buyBtns[0] = (ImageButton) findViewById(R.id.buy1Bt);
...
progressBars[0] = (ProgressBar) findViewById(R.id.prog1pB);
...
buildBtns[0] = (Button) findViewById(R.id.build1Bt);
...
或者是否有任何可以使用的变态技巧?
答案 0 :(得分:3)
我会这样做:
final int[] earnTvsId = new int[] {R.id.earn1Tv, R.id.earn2Tv, R.id.earn3Tv, R.id.earn4Tv ...};
for(int i = 0; i < earnTvsId.length; ++i){
earnTvs[i] = (TextView) findViewById(earnTvsId[i]);
}
如果您想使用getIdentifier()
方法:
for (int i = 0; i < NUMBER_OF_TEXTVIEWS; ++i) {
final int resId = getResources().getIdentifier("earn" + i + "Tv", "id", getPackageName());
earnTvs[i] = (TextView) findViewById(resId);
}
答案 1 :(得分:0)
反思。但是我不确定这里的反射是否合适......
Class<?> idClass = R.id.getClass();
Field field = idClass.getField("earn" + i + "Tv");
TextView textView = (TextView) field.get(R.id);
答案 2 :(得分:0)
你可以使用反射来达到这个目的,但是已知在Android上(特别是旧版本)和指定的用例非常难以维护;如果身份证改变怎么办?您必须在2个位置(XML和代码)进行更改,而不是让IDE处理传播更改。
如果你感到烦恼,或许你应该看一下Android Annotations。它使用编译时注释&amp;一个注释处理器,可以帮助您减少样板代码。