【问题标题】:Java Dynamic NamesJava 动态名称
【发布时间】:2015-05-11 04:21:28
【问题描述】:

我知道,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);
    ...

或者有什么诡计可以用的吗?

【问题讨论】:

  • 反映有什么帮助吗?这似乎是您正在寻找的,或多或少。
  • getResources().getIdentifier() 就是你要找的东西
  • 我看到返回一个 int。在我的情况下,我必须如何使用它?

标签: java android dynamic names


【解决方案1】:

我会这样做:

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

【讨论】:

  • 我认为 OP 不知道数组中的内容。他希望一切都充满活力。
  • 在这种情况下我不会使用反射。这只是我的意见,但如果你想使用 Android Proguard 和其他东西,反思会让你难以思考。
  • 是的,那至少会好一点,但似乎我可以使用反射,我只是不明白如何!
  • @user3646267 我在答案中添加了第二种可能性。
  • 好的,这似乎正是我正在寻找的想法。我意识到如果这些 TextViews 的名称发生更改会有多糟糕,因为没有 IDE 能够正确地重构它,但就我而言,它对我有很大帮助!
【解决方案2】:

有反射。但我不确定这里的反射是否很好......

Class<?> idClass = R.id.getClass();
Field field = idClass.getField("earn" + i + "Tv");
TextView textView = (TextView) field.get(R.id);

【讨论】:

  • 我猜第一行是 R.id.class,不是吗?在 (R.id) 处也有一个表达式;
【解决方案3】:

您可以为此目的使用反射,但众所周知,这在 Android(尤其是旧版本)上速度很慢,并且对于指定的用例来说非常难以维护;身份证换了怎么办?您必须在 2 个地方(XML 和代码)进行更改,而不是让 IDE 处理传播更改。

如果您对模板感到恼火,也许您应该看看Android Annotations。它使用编译时注释和注释处理器来帮助您减少样板代码。

【讨论】:

  • 即使在这种情况下它无法维护,我也想了解它,但我没有设法让它工作。你能告诉我,在这种情况下它会是什么样子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 2017-05-31
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多