如何使用循环填充视图?TextView组件批量赋值代码实现疑问
这个想法很实用!不过在Android开发里,Java或者Kotlin都不支持直接通过tv_{i}这种字符串拼接变量名的方式来访问控件,但我们有几种更靠谱的方法来实现批量赋值:
方法一:将TextView存入集合后循环(推荐)
这种方法最直观也最安全,先把需要操作的TextView统一放进数组或列表,再通过循环遍历赋值:
Java 示例
import java.util.Arrays; import java.util.List; import android.widget.TextView; // 初始化TextView列表 List<TextView> textViews = Arrays.asList( findViewById(R.id.tv_1), findViewById(R.id.tv_2), findViewById(R.id.tv_3) ); // 循环赋值 for (int i = 0; i < textViews.size(); i++) { // 这里i从0开始,所以加1对应1、2、3 textViews.get(i).setText(String.valueOf(i + 1)); }
Kotlin 示例
import android.widget.TextView val textViews = listOf( findViewById<TextView>(R.id.tv_1), findViewById<TextView>(R.id.tv_2), findViewById<TextView>(R.id.tv_3) ) // 使用forEachIndexed同时获取索引和控件 textViews.forEachIndexed { index, tv -> tv.text = "${index + 1}" }
方法二:通过资源ID动态查找控件
如果你不想手动逐个添加控件到集合,可以利用Android资源ID的命名规则,通过getIdentifier()方法动态获取控件ID,再找到对应的TextView:
Java 示例
import android.widget.TextView; for (int i = 1; i <= 3; i++) { // 动态拼接控件名,获取资源ID int resId = getResources().getIdentifier("tv_" + i, "id", getPackageName()); TextView tv = findViewById(resId); // 一定要判空,避免控件不存在时出现空指针异常 if (tv != null) { tv.setText(String.valueOf(i)); } }
Kotlin 示例
import android.widget.TextView for (i in 1..3) { val resId = resources.getIdentifier("tv_$i", "id", packageName) val tv = findViewById<TextView>(resId) // Kotlin的安全调用运算符?.避免空指针 tv?.text = "$i" }
额外:使用ViewBinding的情况
如果你的项目已经用了ViewBinding(现在推荐的绑定方式),可以直接把Binding类里的控件放进集合再循环,这种方式完全避免空指针:
// 假设你的布局是activity_main.xml,对应的Binding类是ActivityMainBinding val binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val textViews = listOf(binding.tv1, binding.tv2, binding.tv3) textViews.forEachIndexed { index, tv -> tv.text = "${index + 1}" }
小提示
- 方法一的稳定性更高,不需要依赖控件的命名规则,也不用担心找不到控件的问题;
- 方法二更适合控件数量特别多的场景,但要确保控件命名严格匹配,并且做好空指针防护;
- ViewBinding是当前Android官方推荐的控件绑定方式,优先使用它能减少很多潜在问题。
内容的提问来源于stack exchange,提问作者Кирилл Емельянов
相关产品推荐
相关产品推荐

