Android点击按钮时如何将多选框值提交至Firebase Database
问题分析与修正方案
兄弟,你这代码的核心问题一眼就能看出来:你把CheckBox的选中判断逻辑放到了Button点击事件的switch分支里,但Button被点击时,view.getId()返回的是按钮自身的ID,根本不会进入任何一个CheckBox的case分支!所以你的Firebase存储代码完全没执行,直接就跳转到下一个页面了,自然看不到数据更新。
修正后的基础实现代码
我们直接在Button的点击事件里逐个检查每个CheckBox的选中状态,同时抽取出重复的代码避免冗余,还加上了用户未登录的空指针防护:
mFirstCheckBox = findViewById(R.id.firstCheckBox); mSecondCheckBox = findViewById(R.id.secondCheckBox); mThirdCheckBox = findViewById(R.id.thirdCheckBox); mDatabase = FirebaseDatabase.getInstance().getReference().child("Users"); mAuth = FirebaseAuth.getInstance(); saveButton = findViewById(R.id.saveButton); saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 先检查用户是否已登录,避免空指针 FirebaseUser currentUser = mAuth.getCurrentUser(); if (currentUser == null) { // 这里可以加个提示,比如Toast提醒用户登录 Toast.makeText(HomeActivity.this, "请先登录", Toast.LENGTH_SHORT).show(); return; } String userId = currentUser.getUid(); DatabaseReference currentUserDb = mDatabase.child(userId); // 逐个检查复选框状态,选中就写入Firebase if (mFirstCheckBox.isChecked()) { currentUserDb.child("1").setValue("Compiler design"); } if (mSecondCheckBox.isChecked()) { currentUserDb.child("2").setValue("Operating Systems"); } if (mThirdCheckBox.isChecked()) { currentUserDb.child("3").setValue("Software Engineering"); } // 跳转页面 Intent interestIntent = new Intent(HomeActivity.this, InterestsActivity.class); interestIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(interestIntent); } });
更优雅的扩展性实现(推荐)
如果以后要增加更多复选框,逐个判断会很繁琐,我们可以把CheckBox和对应的文本、键值配对存储,用循环统一处理:
mFirstCheckBox = findViewById(R.id.firstCheckBox); mSecondCheckBox = findViewById(R.id.secondCheckBox); mThirdCheckBox = findViewById(R.id.thirdCheckBox); mDatabase = FirebaseDatabase.getInstance().getReference().child("Users"); mAuth = FirebaseAuth.getInstance(); saveButton = findViewById(R.id.saveButton); saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { FirebaseUser currentUser = mAuth.getCurrentUser(); if (currentUser == null) { Toast.makeText(HomeActivity.this, "请先登录", Toast.LENGTH_SHORT).show(); return; } String userId = currentUser.getUid(); DatabaseReference currentUserDb = mDatabase.child(userId); // 用列表存储复选框、对应的键和文本 List<Map.Entry<CheckBox, Map.Entry<String, String>>> checkBoxEntries = new ArrayList<>(); checkBoxEntries.add(new AbstractMap.SimpleEntry<>(mFirstCheckBox, new AbstractMap.SimpleEntry<>("1", "Compiler design"))); checkBoxEntries.add(new AbstractMap.SimpleEntry<>(mSecondCheckBox, new AbstractMap.SimpleEntry<>("2", "Operating Systems"))); checkBoxEntries.add(new AbstractMap.SimpleEntry<>(mThirdCheckBox, new AbstractMap.SimpleEntry<>("3", "Software Engineering"))); // 循环处理每个复选框 for (Map.Entry<CheckBox, Map.Entry<String, String>> entry : checkBoxEntries) { CheckBox checkBox = entry.getKey(); if (checkBox.isChecked()) { String key = entry.getValue().getKey(); String text = entry.getValue().getValue(); currentUserDb.child(key).setValue(text); } } // 跳转页面 Intent interestIntent = new Intent(HomeActivity.this, InterestsActivity.class); interestIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(interestIntent); } });
这样以后新增复选框,只需要在列表里加一行即可,代码维护性更强。
额外注意事项
- 确保你的Firebase数据库规则已经配置了允许已登录用户写入自己的数据,比如:
{ "rules": { "Users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } } - 如果需要记录未选中的选项(比如设置为
null或者删除节点),可以在判断时加上else分支,根据你的业务需求处理。
内容的提问来源于stack exchange,提问作者Thrinadh Reddy
相关产品推荐
相关产品推荐

