如何让提交按钮获取动态创建的EditText控件的输入值
动态生成EditText的取值方案
你所有动态创建的EditText都存放在arrowSubmissions这个LinearLayout容器中,直接遍历容器子View或者提前用集合存储EditText实例都可以实现取值需求,两种方案的实现代码如下:
方案1:遍历父容器筛选EditText(无需额外存储控件)
直接遍历LinearLayout的所有子View,筛选出EditText类型的控件即可获取所有输入值,适合父容器内只有动态生成的EditText的场景:
// 按钮初始化移到循环外,避免重复查找控件 Button sbmtButton = findViewById(R.id.submit_button); LinearLayout arrowSubmissions = findViewById(R.id.arrow_submissions); // 动态创建EditText的逻辑不变 for(int i = 0; i < arrows; i++){ EditText submission = new EditText(this); submission.setHint(String.format("%d", i + 1)); arrowSubmissions.addView(submission); } // 设置按钮点击事件 sbmtButton.setOnClickListener(v -> { List<String> inputValues = new ArrayList<>(); // 遍历父容器所有子View int childCount = arrowSubmissions.getChildCount(); for (int j = 0; j < childCount; j++) { View child = arrowSubmissions.getChildAt(j); // 仅处理EditText类型的子View if (child instanceof EditText) { EditText et = (EditText) child; String content = et.getText().toString().trim(); inputValues.add(content); } } // 此处可添加inputValues的后续处理逻辑 });
方案2:提前用集合存储EditText实例(效率更高)
在类中声明EditText集合,创建控件时直接存入集合,取值时直接遍历集合即可,适合父容器内还有其他类型控件的场景:
// 在Activity/Fragment的成员变量位置声明存储控件的集合 private List<EditText> mEditTextList = new ArrayList<>(); // 初始化逻辑 Button sbmtButton = findViewById(R.id.submit_button); LinearLayout arrowSubmissions = findViewById(R.id.arrow_submissions); for(int i = 0; i < arrows; i++){ EditText submission = new EditText(this); submission.setHint(String.format("%d", i + 1)); arrowSubmissions.addView(submission); // 创建时就将控件存入集合 mEditTextList.add(submission); } // 点击事件直接遍历集合取值 sbmtButton.setOnClickListener(v -> { List<String> inputValues = new ArrayList<>(); for (EditText et : mEditTextList) { String content = et.getText().toString().trim(); inputValues.add(content); } // 此处可添加inputValues的后续处理逻辑 });
注意事项
- 不要将按钮的
findViewById逻辑写在循环内,重复查找控件会造成不必要的性能损耗,移到循环外执行一次即可 - 如果需要匹配每个EditText对应的序号,可以在创建控件时调用
submission.setTag(i)存储位置标识,取值时通过et.getTag()拿到对应序号 - 如果需要校验输入内容,可以在遍历的时候添加非空、格式校验逻辑
内容的提问来源于stack exchange,提问作者JustinY97
相关产品推荐
相关产品推荐

