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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:01:16