Android Java中如何通过findViewById()动态获取控件ID
动态按命名规则遍历获取XML中TextView控件的实现方法
完全可以实现该需求。你直接拼接ID字符串调用findViewById()失效的核心原因是:findViewById()接收的入参是编译期生成的整型资源ID,并非字符串类型的控件ID名,直接传入拼接的字符串无法匹配到XML中定义的控件。
具体实现逻辑如下:
- 借助
Resources类提供的getIdentifier()方法,通过拼接的字符串ID名反向查找对应的整型资源ID - 用for循环遍历0-15的序号,批量拿到所有slot开头的控件ID
- 对返回的资源ID做合法性校验后,再调用
findViewById()获取控件实例,避免空指针
对应Java实现代码:
List<TextView> slotTextViews = new ArrayList<>(); // 遍历slot0到slot15 for (int index = 0; index < 16; index++) { // 拼接和XML中命名一致的ID字符串 String targetIdName = "slot" + index; // 匹配对应整型资源ID:参数依次为 资源名、资源类型、当前应用包名 int viewId = getResources().getIdentifier(targetIdName, "id", getPackageName()); // 资源ID为0代表未找到对应控件,跳过避免崩溃 if (viewId != 0) { TextView currentSlot = findViewById(viewId); slotTextViews.add(currentSlot); } }
注意事项:如果在Fragment中使用该逻辑,需要通过
requireContext()获取上下文实例来调用getResources()和getPackageName(),不要直接使用脱离宿主生命周期的方法调用。
内容的提问来源于stack exchange,提问作者Jeronimo
相关产品推荐
相关产品推荐

