【问题标题】:android Iterating through Views by Idandroid通过Id遍历视图
【发布时间】:2011-11-22 17:05:37
【问题描述】:
我的布局包含 4 个带有 id 的 TextView:“Name1”、“Name2”、“Name3”、“Name4”
我想用 for 循环对它们进行迭代,
有没有办法做到这一点?
类似
for(int i = 1; i <= 4; i++)
{
findViewById(R.id."Name" + i)
}
我知道这段代码远非真实,但有什么帮助吗?
谢谢!
罗恩
【问题讨论】:
标签:
android
view
for-loop
loops
【解决方案1】:
不,您不能那样做,因为 R.id.xyz 正在引用静态类的静态 int。它不是一个可以像那样连接的字符串。此外,您的代码忽略了 findViewById 的返回值,因此它什么也不做(尽管我意识到您提到的代码是真实的,但仍然是一个实际的用例可能有助于澄清您要做什么)。 R.id."Name" 没有任何意义,会给你一个编译器错误。
要循环,你可以这样做:
int[] ids = {R.id.foo, R.id.bar};
然后
for(int i = 0; i<ids.length; i++) {
View v = findViewById(ids[i]);
}
【解决方案2】:
当然,你可以做到这一点。您不能使用字符串文字访问 R.id 的成员,您必须输入变量名。
R.id."Test" 不好,但 R.id.Test 很好。
如果您检查R.id.XYZ 的类型,您会发现它只是一个整数。没有理由不能对 id 值执行基本算术运算。
但是这样做并没有真正的意义。当您构建 APK 时,编译器会自动创建一个名为 R 的静态类,其中包含对 APK 中包含的各种资源和资产的引用,例如布局、可绘制对象、声音等。
仅仅因为您知道 R.id.button1 的整数值是 X,因此不能保证 R.id.button2 的整数值一定是 X+1,实际上它可以是任何值。
如果您想创建一个 TextViews 列表进行迭代,请考虑将它们添加到列表中,然后迭代该列表。像这样:
ArrayList<TextView> list = new ArrayList<TextView>();
list.add( (TextView) findViewById(R.id.textView1) );
list.add( (TextView) findViewById(R.id.textView2) );
list.add( (TextView) findViewById(R.id.textView3) );
list.add( (TextView) findViewById(R.id.textView4) );
int size = list.getSize();
for (int i=0; i< size; i++)
{
TextView tv = list.get(i);
// Do something with tv like set its label to i
tv.setText(Integer.toString(i));
}