
本文旨在解决Android Quiz App开发中,用户自定义问题数量时循环无法达到预期次数的问题。通过分析问题代码,提供简化后的解决方案,确保循环能够按照用户设定的数量执行,并成功存储问题和答案,最后跳转到答题页面。
问题分析
原始代码中,循环逻辑存在一些问题,导致无法按照用户设定的问题数量进行循环。主要问题在于:
- 循环条件错误: for (int i = 1; i
- i == amounts 判断永远为 false: 由于循环条件是 i
- Intent 的启动时机错误: Intent 应该在循环结束后启动,而不是在循环内部的某个特定条件满足时启动。
解决方案
以下是修改后的 logicg() 方法,它解决了上述问题,并简化了代码:
private void logicg() {
String mount = jshared.getString("amount", "");
int amounts = Integer.parseInt(mount);
for (int i = 0; i < amounts; i++) {
map = new HashMap<>();
map.put("answer", Objects.requireNonNull(ans.getText()).toString());
map.put("question", inop.getText().toString());
jshared2.edit().putString("data", new Gson().toJson(map)).apply(); // 使用 apply 异步提交
}
Intent intent = new Intent(question.this, answerscrn.class);
startActivity(intent);
}代码解释:
酷纬企业网站管理系统Kuwebs是酷纬信息开发的为企业网站提供解决方案而开发的营销型网站系统。在线留言模块、常见问题模块、友情链接模块。前台采用DIV+CSS,遵循SEO标准。 1.支持中文、英文两种版本,后台可以在不同的环境下编辑中英文。 3.程序和界面分离,提供通用的PHP标准语法字段供前台调用,可以为不同的页面设置不同的风格。 5.支持google地图生成、自定义标题、自定义关键词、自定义描
- 循环条件修改: for (int i = 0; i
- 移除不必要的判断: 移除了 if (i == amounts) 判断,因为跳转页面的逻辑应该在循环结束后执行。
- 异步提交: 使用 apply() 方法代替 commit() 方法,异步提交数据到 SharedPreferences,避免阻塞主线程。
注意事项:
- 确保 ans.getText() 和 inop.getText() 不为空,否则可能会导致 NullPointerException。可以使用 TextUtils.isEmpty() 方法进行判断,或者在UI上进行强制输入。
- SharedPreferences 适合存储少量数据,如果需要存储大量问题和答案,建议使用数据库。
- 建议使用 apply() 方法代替 commit() 方法,异步提交数据到 SharedPreferences,避免阻塞主线程。commit() 是同步操作,可能会导致UI卡顿。
- 在循环内部创建 HashMap 可能会导致内存占用过高,如果问题数量非常大,可以考虑在循环外部创建 HashMap,并在每次循环时清空。
完整示例代码:
package com.prgr.quizards.canary;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
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 HashMap map = new HashMap<>();
private TextView text;
private EditText inop;
private TextInputEditText ans;
private AppCompatButton btn;
private SharedPreferences jshared2;
private SharedPreferences jshared;
@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());
}
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);
}
private void logicg() {
String mount = jshared.getString("amount", "");
int amounts = Integer.parseInt(mount);
for (int i = 0; i < amounts; i++) {
String question = inop.getText().toString();
String answer = Objects.requireNonNull(ans.getText()).toString();
if (TextUtils.isEmpty(question) || TextUtils.isEmpty(answer)) {
Toast.makeText(getApplicationContext(), "Question or Answer cannot be empty", Toast.LENGTH_SHORT).show();
return; // 停止执行,提示用户输入
}
map = new HashMap<>();
map.put("answer", answer);
map.put("question", question);
jshared2.edit().putString("data", new Gson().toJson(map)).apply();
}
Intent intent = new Intent(question.this, answerscrn.class);
startActivity(intent);
}
} 总结
通过修改循环条件,移除不必要的判断,并使用 apply() 方法异步提交数据,可以解决Android Quiz App开发中用户自定义问题数量时循环无法达到预期次数的问题。同时,需要注意输入校验和数据存储方式的选择,以确保程序的稳定性和性能。








