Android中为foreach循环动态创建的视图设置唯一ID问题
解决动态添加TextView时ID重复的问题
嘿,我之前也踩过这个坑!你直接用从0开始的整数当ID,很容易和Android系统内部的视图ID冲突,或者因为系统的ID管理机制,导致这些ID没被正确识别为唯一值,所以才会出现所有视图共用同一个ID的情况。
给你两个靠谱的解决方案:
- 优先用系统生成的唯一ID
Android从API 17开始提供了View.generateViewId()方法,它会自动生成全局唯一的整数ID,完全不用自己维护计数器,代码改起来超简单:
TableLayout table = findViewById(R.id.table); // 变量名首字母小写更符合Java规范哦 for (String string : array) { TableRow row = new TableRow(this); TextView serialText = new TextView(this); serialText.setText(string); // 用系统方法生成唯一ID,再也不用担心重复 serialText.setId(View.generateViewId()); row.addView(serialText); table.addView(row); // 别忘了把创建好的行添加到表格里,你原来的代码漏了这步! // 后面的复选框也可以用同样的方式设置ID }
- 兼容低版本的手动ID方案
如果你的App需要支持Android 4.2以下(API <17)的设备,View.generateViewId()用不了,那可以从一个足够大的整数开始计数,避开系统默认的ID范围(系统ID通常是较小的整数):
TableLayout table = findViewById(R.id.table); int idCounter = 10000; // 从10000开始,基本不会和系统ID冲突 for (String string : array) { TableRow row = new TableRow(this); TextView serialText = new TextView(this); serialText.setText(string); serialText.setId(idCounter); idCounter++; row.addView(serialText); table.addView(row); }
另外提个小细节:你原来的代码里没有把创建好的TableRow添加到TableLayout中,这会导致这些行根本不会显示在界面上,一定要加上table.addView(row)这一步哦!
内容的提问来源于stack exchange,提问作者David Denny
相关产品推荐
相关产品推荐

