android开发系列之性格测试,性格色彩测试android程序开发之十--输出结果
思路:根据用户选择的每道题的选项,进行判断用户性格颜色所占的比例,比例最大的性格色彩即为要返回的结果。而判断用户性格颜色所占的比例的方法也很简单,因为没到性格测试题的选项都是从A-D按照“红”、“蓝”、“黄”、“绿”的顺序进行排列的。
对于存储用户的答案来说,有两种方式,一种是建立本地文件;一种是使用动态数组的方式,把结果直接存在内存中。
我这里选择的是把结果直接存在内存中,然后读取出来计算结果。使用的数组是HashMap,因为对于一道题,也就是一个惟一的题目ID,用户可能会反复修改答案,所以HashMap提供的键值对特性,
put()方法自动用新值替换与指定关键字相关联的原先值,就很好地解决了问题。
但是在使用的过程中,遇到了很严重的错误:空指针异常。
问题出在了HashMap数组的下标初始值是1,而不是0.
性格色彩测试2.0没有实现上下翻页的优化,在3.0中除去了上翻页的按钮。
为了保证测试的准确性,就需要引导用户在读完题目后最好就能做出选择,选择自己第一反应出来的答案,而且一旦选中不能更改。当用户下翻页时,若没有选择某一选项则给予提示,只有用户选中了某一项后,才能跳转到下一页。另外,只有到翻页到最后一题时,并且选择了答案后,才显示测试结果。
在开发3.0版的过程中,遇到一个BUG,当显示测试界面后,点击第一题的答案后,虽然可以实现向下一题的跳转,但是直接从第一题调转到了最后一题。 错误的原因在于:每次点击任何一个单选按钮都会触发事件,如果代码写成如下图
所示的话
,产生的事件即便不是由对应的按钮产生的,也会处触发黄色区域的代码执行。而事实上,每当点击一个单选按钮时,除了翻页外,翻页的事件本身又会触发一个新的事件,因而又会导致黄色区域代码的执行。这样就成了一个循环直至执行到currentNum的值为试题总数结束。
解决的办法就是:保证在触发了特定的事件后才执行黄色区域的代码,也就是把那部分代码分四份分别放在if语句的执行体中。
代码:
package logan.lejia;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
public class TestingView extends Activity {
private TextView textview_title;// 题目的标题
private TextView textview;// 显示当前题号和共有多少题目信息
private RadioButton buttonFir, buttonSec, buttonThir, buttonFour;
private RadioGroup radioGroup = null;
private final int version = 1;
private static int currentNum = 1;
SQLiteHelper helper = new SQLiteHelper(TestingView.this, "lejia", null,
version);
// 用于存放用户所选测试题选项
private static HashMap hash = new HashMap();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.answview);
// 试题的题干
textview_title = (TextView) findViewById(R.id.textView_problems_title);
// 单选按钮和按钮组
buttonFir = (RadioButton) findViewById(R.id.radioButton1);
buttonSec = (RadioButton) findViewById(R.id.radioButton2);
buttonThir = (RadioButton) findViewById(R.id.radioButton3);
buttonFour = (RadioButton) findViewById(R.id.radioButton4);
radioGroup = (RadioGroup) findViewById(R.id.ButtonGroup);
// 两个按钮中间的textView
textview = (TextView) findViewById(R.id.textView_bottomView);
textview.setTextSize(15);
radioGroup
.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == buttonFir.getId()) {
hash.put(currentNum + "", 1);// 存信息
if (currentNum != 10) {
turnToNextPage();
} else if (currentNum == 10) {
// 用户答题完毕,显示测试结果
calculateResult();
}
} else if (checkedId == buttonSec.getId()) {
hash.put(currentNum + "", 2);
if (currentNum != 10) {
turnToNextPage();
} else if (currentNum == 10) {
// 用户答题完毕,显示测试结果
calculateResult();
}
} else if (checkedId == buttonThir.getId()) {
hash.put(currentNum + "", 3);
if (currentNum != 10) {
turnToNextPage();
} else if (currentNum == 10) {
// 用户答题完毕,显示测试结果
calculateResult();
}
} else if (checkedId == buttonFour.getId()) {
hash.put(currentNum + "", 4);
if (currentNum != 10) {
turnToNextPage();
} else if (currentNum == 10) {
// 用户答题完毕,显示测试结果
calculateResult();
}
}
System.out.println("onCheckedChanged:" + currentNum);
}
});
// 刚进入界面时,要显示第一题的信息
displayPorblems(currentNum);
}
/**
* 显示测试题信息,需要传入当前的试题号
*
* @param currentNum
*/
private void displayPorblems(int currentNum) {
// 获取可以进行增删改查的数据库实例
SQLiteDatabase database = helper.getWritableDatabase();
Cursor cursor = database.query("test", new String[] { "id", "title",
"first", "second", "third", "fourth" }, "id=?",
new String[] { currentNum + "" }, null, null, null);
cursor.moveToFirst();
// 共有6列,标号从0-5
String title = cursor.getString(1);// 题干
String first = cursor.getString(2);// 选项A
String second = cursor.getString(3);// 选项B
String third = cursor.getString(4);// 选项C
String fourth = cursor.getString(5);// 选项D
cursor.close();
database.close();
textview_title.setText(title);
buttonFir.setText(first);
buttonSec.setText(second);
buttonThir.setText(third);
buttonFour.setText(fourth);
textview.setText("第" + currentNum + "题/共有" + "10" + "题");
}
private void calculateResult() {
int red = 0;
int blue = 0;
int yellow = 0;
int green = 0;
System.out.println(hash.size());
for (int i = 1; i <= hash.size(); i++) {
int selectedItem = hash.get(i + "");
if (selectedItem == 1) {
red = red + 1;
} else if (selectedItem == 2) {
blue = blue + 1;
} else if (selectedItem == 3) {
yellow = yellow + 1;
} else if (selectedItem == 4) {
green = green + 1;
}
}
Intent intent = new Intent();
if (red >= blue) {
if (red >= yellow) {
if (red >= green) {
intent.setClass(TestingView.this, ActivityRed.class);
this.finish();
} else {
intent.setClass(TestingView.this, ActivityGreen.class);
this.finish();
}
} else {
if (yellow >= green) {
intent.setClass(TestingView.this, ActivityYellow.class);
this.finish();
} else {
intent.setClass(TestingView.this, ActivityGreen.class);
this.finish();
}
}
} else {
if (blue >= yellow) {
if (blue >= green) {
intent.setClass(TestingView.this, ActivityBlue.class);
this.finish();
} else {
intent.setClass(TestingView.this, ActivityYellow.class);
this.finish();
}
} else {
if (yellow >= green) {
intent.setClass(TestingView.this, ActivityYellow.class);
this.finish();
} else {
intent.setClass(TestingView.this, ActivityGreen.class);
this.finish();
}
}
}
startActivity(intent);
}
private void turnToNextPage() {
// 下翻页
// 自加
currentNum = currentNum + 1;
System.out.println("turnToNextPage()" + currentNum);
// 刷新测试题
this.displayPorblems(currentNum);
radioGroup.clearCheck();
}
} 答题完毕后效果图:
android开发系列之性格测试,性格色彩测试android程序开发之十--输出结果相关推荐
- Silverlight for Windows Phone 7开发系列(2):第一个Silverlight程序
前言 上一篇讲述了Windows Phone 7开发环境的搭建,这篇文章讲述如何创建,部署,调试以及运行Silverlight for Windows Phone应用程序,同时介绍如何Microsof ...
- 十次方项目开发系列【8】:对评论点赞功能开发 Redis的配置和使用
使用对评论点赞和取消点赞功能开发 一 评论点赞功能开发 1.1 先根据评论的id查询,再对点赞数加一 1.1.1 在CommentController添加方法 1.1.2 在CommentServic ...
- Excel 二次开发系列(3): 创建Excel二次开发环境
Excel 二次开发系列 前面我们讲到了 Excel编程模型及Excel 常用操作方法,在这一节,我说一下基础的怎么创建一个Excel应用级的二次开发程序. 在微软的这个基础网站里面可以找到很多的有用 ...
- 显示器色彩精度测试软件,色彩测试篇:色彩还原准确度测试_SANC E7 PRO_液晶显示器评测-中关村在线...
下面我们进入色彩测试环节,分别有色彩还原准确度测试.色域覆盖度测试.色温一致性测试.色度均匀性测试.亮度均匀性测试.伽马曲线测试.然后我们通过这些测试来看看,这款显示器在色彩显示方面的性能如何. 环节 ...
- 【Android 教程系列第 25 篇】如何使用 Android Studio 生成 keystore 签名文件
这是[Android 教程系列第 25 篇],如果觉得有用的话,欢迎关注专栏. Android Studio 版本:Arctic Fox 2020.3.1 Pathc 3,这里我新建了一个安卓项目,剩 ...
- 【移动应用开发】2022/2023 年 8 大移动应用程序开发趋势
迄今为止,技术进步见证了超过 500 万个应用程序的开发.在全球范围内,应用程序开发市场很火爆,预计未来几年将继续火爆. 到 2022 年,预计会更大.更快,总体上会带来向应用程序的巨大转变.让我们分 ...
- 【Qt+OpenCV项目开发学习】二、图片查看器应用程序开发
一.前言 本博客将讲解如何用Qt+OpenCV开发一款图片查看器的Windows应用程序,其实不用OpenCV也能开发出这类软件,作者目的是为了学习Qt+OpenCV开发项目,所以会使用OpenCV, ...
- python程序开发模块化_python-17-Python文件两种用途、模块化程序开发
--------------------------------python文件的两种用途---------------------------------- py文件的两种用途: 1.直接运行 pr ...
- python炒股软件开发_Python之路day03-习题+作业-股票查询程序开发
女神博客链接:https://www.cnblogs.com/Eva-J/articles/11214642.html#_label16 练习题 1.任一个英文的纯文本文件,统计其中的每个单词出现的个 ...
- 音视频开发系列(26)三种方式绘制图片-android开发
在android开发中我们最常使用的绘制图片的方式就是ImageView,设置src.那么有没有其他方案可以实现图片的绘制呐? 三种方案 通过Imageview设置setImageBitmap fin ...
最新文章
- jq修改iframe html代码,jQuery控制iFrame(实例代码)
- android自定义吐司通知,IOS 仿Android吐司提示框的实例(分享)
- YOLO3实现目标检测(VS2015+OPENCV3.4.2+YOLO3+CUDA10.0+CUDNN7.5)
- CSDN官方发布的《180道Python面试题,助你一举通过面试》浅析一
- Swift之深入解析如何避免单元测试中的强制解析
- 1.1 算法编译与调试
- html层次选择器例题,详解强大的jQuery选择器之基本选择器、层次选择器
- POI SXSSFWorkbook 实现大批量数据 导出
- C# 通过接口IEnumerator让自己编写的对象/类,实现foreach遍历方法
- android 自定义课程表,Android课程表界面布局实现代码
- 【原创】运维基础之keepalived
- 哈夫曼编码+python实现
- 【转】英文版XP不能安装中文版软件
- 网络规划设计师的参考资料和复习书籍
- 如何调用WebService
- Bypassing Stack Cookies, SafeSeh, SEHOP, HW DEP and ASLR
- ExtJS界面设计工具 Ext Designer
- 网络历史之金融投资三剑客01
- php上传pdf文件错误,php上传pdf文件,一些特殊字符丢失
- Android Studio 学习记录-图形定制