Android问答App循环逻辑异常:无法按指定数量存储问答对
问题分析与修复方案
1. 核心问题拆解
- 循环条件错误:原代码中
for (int i = 1; i < amounts; i++)的循环范围是1到amounts-1,i永远不可能等于amounts,导致跳转逻辑永远无法触发。 - 存储逻辑错误:每次循环用同一个
"data"键存储序列化后的Map,后续内容会直接覆盖之前的问答对,最终SharedPreferences只保留最后一条数据。 - 交互逻辑错误:原代码点击一次按钮就循环执行
amounts次,但每次都读取同一个输入框的内容,会重复保存相同数据,不符合用户逐步输入问答对的实际需求。
2. 修复后的完整代码
package com.prgr.quizards.canary; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.widget.AppCompatButton; import com.google.android.material.textfield.TextInputEditText; import com.google.gson.Gson; import java.util.HashMap; import java.util.Objects; public class question extends Activity { private TextView text; private EditText inop; private TextInputEditText ans; private AppCompatButton btn; private SharedPreferences jshared2; private SharedPreferences jshared; private int savedCount = 0; private int totalAmounts = 0; @Override protected void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); setContentView(R.layout.activity_question); initializedata(); AppCompatButton btn2 = findViewById(R.id.button3); btn = findViewById(R.id.button); btn2.setOnClickListener(v -> gotoback()); btn.setOnClickListener(view -> logicg()); // 读取用户指定的总问答对数量 String mount = jshared.getString("amount", ""); totalAmounts = Integer.parseInt(mount); updateInputHint(); } public void gotoback(){ Intent intent = new Intent(question.this, activity_home_screen.class); startActivity(intent); } private void initializedata(){ jshared = getSharedPreferences("j", Activity.MODE_PRIVATE); jshared2 = getSharedPreferences("j2", Activity.MODE_PRIVATE); inop = findViewById(R.id.inop); ans = findViewById(R.id.ans); text = findViewById(R.id.text1); // 恢复已保存的问答对数量(防止页面旋转丢失进度) savedCount = jshared2.getInt("saved_count", 0); } private void logicg() { // 校验输入是否为空 String questionContent = inop.getText().toString().trim(); String answerContent = Objects.requireNonNull(ans.getText()).toString().trim(); if (questionContent.isEmpty() || answerContent.isEmpty()) { Toast.makeText(this, "请输入完整的问答内容", Toast.LENGTH_SHORT).show(); return; } // 存储当前问答对,用索引作为唯一标识 HashMap<String, Object> qaMap = new HashMap<>(); qaMap.put("answer", answerContent); qaMap.put("question", questionContent); jshared2.edit() .putString("qa_" + savedCount, new Gson().toJson(qaMap)) .putInt("saved_count", ++savedCount) .apply(); // 清空输入框,方便下一次输入 inop.setText(""); ans.setText(""); // 判断是否完成全部输入 if (savedCount == totalAmounts) { Intent intent = new Intent(question.this, answerscrn.class); startActivity(intent); // 跳转后重置计数器,避免再次进入时残留进度 jshared2.edit().putInt("saved_count", 0).apply(); finish(); } else { updateInputHint(); Toast.makeText(this, "已保存第" + savedCount + "个问答对", Toast.LENGTH_SHORT).show(); } } // 更新输入提示文本,显示当前进度 private void updateInputHint() { text.setText("请输入第" + (savedCount + 1) + "个问答对(共" + totalAmounts + "个)"); } }
3. 关键修复说明
- 移除无效循环:改用计数器
savedCount跟踪已保存的问答对数量,每次点击按钮保存一条,符合用户逐步输入的交互逻辑。 - 解决存储覆盖问题:用
qa_加索引作为每个问答对的存储键,确保所有数据都能被保留。 - 添加输入校验:防止用户提交空内容,提升交互体验。
- 进度状态管理:从SharedPreferences恢复计数器,避免页面旋转等配置变更导致进度丢失;跳转后重置计数器,避免残留状态影响下次使用。
- 优化存储效率:用
apply()替代commit(),异步执行存储操作,不阻塞主线程。
内容的提问来源于stack exchange,提问作者Harleythetech
相关产品推荐
相关产品推荐

