Android如何获取动态添加的EditText的值并存入HashMap上传Firebase
动态生成EditText取值及存入HashMap解决方案
你当前的核心问题是没有存储所有动态生成的EditText实例引用,每次生成新实例时全局变量会覆盖旧的引用,导致无法追溯之前生成的输入框。可以按以下步骤修改实现:
实现步骤
- 在Activity类级别声明全局存储容器,持有所有动态生成的EditText实例,以及用于上传Firebase的HashMap
- 每次生成新EditText后将其加入全局实例列表,避免引用丢失
- 提交数据时遍历列表统一提取输入内容,或通过TextWatcher实时同步输入到HashMap
完整修改代码
第一步:添加全局变量
在TechnicianTaskCard类的onCreate方法外添加如下声明:
// 存储所有动态生成的EditText实例 private List<EditText> jobEditTextList = new ArrayList<>(); // 存储输入内容,可直接上传到Firebase private HashMap<String, Object> jobDataMap = new HashMap<>();
第二步:修改按钮点击新增逻辑
GridLayout JobsFieldGrid = findViewById(R.id.GRIDJOBS); Button add = findViewById(R.id.AddJobs); add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int InitialRowCount = JobsFieldGrid.getRowCount(); int count = InitialRowCount+1; Log.d("row", String.valueOf(InitialRowCount)); // 改为局部变量,避免全局变量覆盖旧实例引用 EditText newJobEt = new EditText(TechnicianTaskCard.this); newJobEt.setHint("Task "+count+"..."); newJobEt.setId(count); JobsFieldGrid.setRowCount(count); JobsFieldGrid.addView(newJobEt); // 新增:将生成的EditText加入全局列表 jobEditTextList.add(newJobEt); // 可选:如果需要实时同步输入内容到HashMap,添加以下TextWatcher String taskKey = "task_" + count; newJobEt.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { jobDataMap.put(taskKey, s.toString().trim()); } }); } });
第三步:提交时收集输入内容(如果没有加实时TextWatcher用这个方案)
// 你的提交按钮点击逻辑 Button submitBtn = findViewById(R.id.你的提交按钮ID); submitBtn.setOnClickListener(v -> { jobDataMap.clear(); // 遍历所有EditText提取输入内容 for (int i = 0; i < jobEditTextList.size(); i++) { String input = jobEditTextList.get(i).getText().toString().trim(); // 自定义键名,符合Firebase命名规则即可 String key = "task_" + (i+1); jobDataMap.put(key, input); } // 直接将jobDataMap传入Firebase写入方法即可 // 示例:FirebaseDatabase.getInstance().getReference("你的节点路径").setValue(jobDataMap); });
注意事项
- 如果业务支持删除动态生成的EditText,删除时需要同步将对应实例从
jobEditTextList中移除,避免遍历到无效视图 - 可以根据业务需求自定义HashMap的键名,只要保证唯一性即可
- 提取输入时建议加非空校验,避免上传空值到Firebase
内容的提问来源于stack exchange,提问作者Mr Learning
相关产品推荐
相关产品推荐

