You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中RadioButton选择结果无法更新至Firestore的问题求助

问题与修复方案

问题现象

开发调查类APP,需监听RadioButton选择变化,将按钮文本以字符串形式存储到Firestore。当前处理两个选项场景,此前布尔型存储功能正常,改为字符串存储后出现异常:首次选择"yes"可成功保存,但后续切换为"no"再切回"yes"时,Firestore中的字符串无法更新。

问题代码分析

全局变量

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference uidRef = db.collection("users").document(uid);
RadioGroup radioGroup;
RadioButton yesButton;
RadioButton noButton;

OnCreate方法

yesButton = findViewById(R.id.a1);
noButton = findViewById(R.id.a2);
radioGroup = findViewById(R.id.radioGroup);
String yes = yesButton.getText().toString();
String no = yesButton.getText().toString(); // 错误:此处应获取noButton的文本,而非yesButton

Firestore快照监听代码

uidRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }

        if (snapshot != null && snapshot.exists()) {
            String participate = snapshot.getString("Would you like to participate");
            // 错误:仅判断字符串是否为空,未根据实际值设置选中状态
            if (participate != null) {
                yesButton.setChecked(true);
            } else {
                noButton.setChecked(true);
            }
        }
    }
});

RadioButton点击事件代码

yesButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (yesButton.isChecked()) {
            Map<String, Object> update = new HashMap<>();
            // 错误:字段名与监听时不一致(监听用"Would you like to participate")
            update.put("Would like to participate", yes);
            uidRef.update(update).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    Toast.makeText(getApplicationContext(), "Response updated ", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
});

noButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (noButton.isChecked()) {
            Map<String, Object> update = new HashMap<>();
            // 错误:字段名不一致,且no变量实际是yes的文本
            update.put("Would like to participate", no);
            uidRef.update(update).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    Toast.makeText(getApplicationContext(), "Response updated ", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
});

Firestore结构

Firestore-root
  |
  --- users
       |
       --- userid
            |
            --- Would you like to participate: yes // 该字符串无法更新

修复方案

1. 修正OnCreate变量赋值错误

将String no = yesButton.getText().toString();改为String no = noButton.getText().toString();,确保no变量获取正确的按钮文本。

2. 统一Firestore字段名

更新数据时使用和监听一致的字段名"Would you like to participate",避免因字段名不匹配导致数据无法更新。

3. 修复快照监听的UI同步逻辑

根据Firestore存储的实际值设置RadioButton选中状态:

uidRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }

        if (snapshot != null && snapshot.exists()) {
            String participate = snapshot.getString("Would you like to participate");
            yesButton.setChecked("yes".equals(participate));
            noButton.setChecked("no".equals(participate));
        }
    }
});

4. 改用RadioGroup统一监听选中事件(推荐)

替代单个按钮的点击事件,更简洁且便于后续扩展多选项:

radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        String selectedText = "";
        if (checkedId == R.id.a1) {
            selectedText = yesButton.getText().toString();
        } else if (checkedId == R.id.a2) {
            selectedText = noButton.getText().toString();
        }
        
        Map<String, Object> update = new HashMap<>();
        update.put("Would you like to participate", selectedText);
        uidRef.update(update).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Toast.makeText(getApplicationContext(), "Response updated", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Update failed", Toast.LENGTH_SHORT).show();
                    Log.e(TAG, "Update failed", task.getException());
                }
            }
        });
    }
});

同时删除原有的单个RadioButton点击事件。


内容的提问来源于stack exchange,提问作者swiftlearneer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:45:39