android开发步步为营之24:milliondollars游戏技术要点代码生成控件和读取xml文件

Milliondollars智力问答游戏,主要的技术要点(一)、读取题库数据xml文件(二)、如何动态的生成题目和选项。这里做个总结,供以后参考。

(一)、读取题库数据xml文件

将assets/topics.xml文件读取

topics.xml格式:

<?xml version="1.0" encoding="UTF-8"?>

<book>

<question topic="《全唐诗》是哪个时期的人编辑的?">

<a>清朝</a>

<b>唐朝</b>

<c>明朝</c>

<d>元朝</d>

<answer>清朝</answer>

</question>

<question topic="荷兰是国花是?">

<a>荷花</a>

<b>玫瑰</b>

<c>风信子</c>

<d>郁金香</d>

<answer>郁金香</answer>

</question>

<question topic="乐山大佛历经多少年方才建成?">

<a>90</a>

<b>80</b>

<c>70</c>

<d>60</d>

<answer>90</answer>

</question>

<question topic="人的自我意识是从什么时候产生的?">

<a>2岁左右</a>

<b>1岁左右</b>

<c>3岁左右</c>

<d>4岁左右</d>

<answer>1岁左右</answer>

</question>

</book>

读取代码:

/**

* 从xml中读取所有的题目

*/

public void readTopicXml() {

DocumentBuilderFactory docBuilderFactory = null;

DocumentBuilder docBuilder = null;

Document doc = null;

try {

docBuilderFactory = DocumentBuilderFactory.newInstance();

docBuilder = docBuilderFactory.newDocumentBuilder();

// xml file 放到 assets目录中的

doc = docBuilder.parse(this.getResources().getAssets()

.open("topics.xml"));

// root element

Element root = doc.getDocumentElement();

// 获取所有的题目

NodeList nodeList = root.getElementsByTagName("question");

topics = new ArrayList<Topic>();

int nodelength = nodeList.getLength();

for (int a = 0; a < nodelength; a++) {

Node nd = nodeList.item(a);

Topic tp = new Topic();

tp.topicid = a;

// topics

tp.topic = nd.getAttributes().item(0).getNodeValue();

// items and answer

NodeList nl = nd.getChildNodes();

int childCount = nl.getLength();

for (int b = 0; b < childCount; b++) {

Node ndchild = nl.item(b);

if (ndchild instanceof Element) {

if (ndchild.getNodeName().equals("a")) {

tp.a = ndchild.getTextContent();

}

if (ndchild.getNodeName().equals("b")) {

tp.b = ndchild.getTextContent();

}

if (ndchild.getNodeName().equals("c")) {

tp.c = ndchild.getTextContent();

}

if (ndchild.getNodeName().equals("d")) {

tp.d = ndchild.getTextContent();

}

if (ndchild.getNodeName().equals("answer")) {

tp.answer = ndchild.getTextContent();

}

}

}

topics.add(tp);

}

} catch (Exception e) {

Log.e("err", e.getMessage());

Log.e("err", e.getStackTrace().toString());

} finally {

doc = null;

docBuilder = null;

docBuilderFactory = null;

Date d = new Date();

Log.i("info", d.toLocaleString()

+ ":MillionaireActivity.readTopicXml complete");

}

}

(二)、如何动态的生成题目和选项

/**

* 动态设置页面

*

* @param topics

*/

public void setLayout(List<Topic> topics) {

try {

int count = topics.size();

Random r = new Random();

int index = r.nextInt(count);

while (al.indexOf(index) != -1) {

index = r.nextInt(count);

}

al.add(index);// 已选择的题目

// scroll view

ScrollView sv = new ScrollView(this);

RelativeLayout.LayoutParams svp = new RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.FILL_PARENT,

RelativeLayout.LayoutParams.FILL_PARENT);

sv.setLayoutParams(svp);

setContentView(sv);

// relative layout

RelativeLayout svlayout = new RelativeLayout(this);

svlayout.setLayoutParams(svp);

sv.addView(svlayout);

tcRadom = topics.get(index);

// TextView

// 当前 得分

RelativeLayout.LayoutParams tp = new RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

tp.topMargin = 8;

tp.leftMargin = 8;

tp.rightMargin = 8;

TextView tv = new TextView(this);

tv.setId(USER_ID + 1);

tv.setText("当前得分:" + total + "美元");

//         tv.setTextColor(Color.RED);

tv.setLayoutParams(tp);

svlayout.addView(tv);

// 题目

RelativeLayout.LayoutParams tpTopic = new RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

tpTopic.topMargin = 8;

tpTopic.leftMargin = 8;

tpTopic.rightMargin = 8;

tpTopic.addRule(RelativeLayout.BELOW, USER_ID + 1);

TextView tvTopic = new TextView(this);

tvTopic.setId(USER_ID + 2);

tvTopic.setText(tcRadom.topic);

//         tvTopic.setTextColor(Color.MAGENTA);

tvTopic.setLayoutParams(tpTopic);

svlayout.addView(tvTopic);

// RadioGroup 选项

items.clear();// 选择的题目对应的选项先清空

alChoseItems.clear();// 已经随机选出的选项先清空

items.add(tcRadom.a);

items.add(tcRadom.b);

items.add(tcRadom.c);

items.add(tcRadom.d);

RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

rp.topMargin = 8;

rp.leftMargin = 8;

rp.rightMargin = 8;

rp.addRule(RelativeLayout.BELOW, USER_ID + 2);

RadioGroup rg = new RadioGroup(this);

rg.setId(USER_ID + 3);

Random ra = new Random();

// A选项随机抽取

int itemAIndex = ra.nextInt(4);

while (alChoseItems.indexOf(itemAIndex) != -1) {

itemAIndex = ra.nextInt(4);

}

alChoseItems.add(itemAIndex);

RadioButton rba = new RadioButton(this);

rba.setText("A." + items.get(itemAIndex));

// B选项随机抽取

int itemBIndex = ra.nextInt(4);

while (alChoseItems.indexOf(itemBIndex) != -1) {

itemBIndex = ra.nextInt(4);

}

alChoseItems.add(itemBIndex);

RadioButton rbb = new RadioButton(this);

rbb.setText("B." + items.get(itemBIndex));

// C选项随机抽取

int itemCIndex = ra.nextInt(4);

while (alChoseItems.indexOf(itemCIndex) != -1) {

itemCIndex = ra.nextInt(4);

}

alChoseItems.add(itemCIndex);

RadioButton rbc = new RadioButton(this);

rbc.setText("C." + items.get(itemCIndex));

// D选项随机抽取

int itemDIndex = ra.nextInt(4);

while (alChoseItems.indexOf(itemDIndex) != -1) {

itemDIndex = ra.nextInt(4);

}

alChoseItems.add(itemDIndex);

RadioButton rbd = new RadioButton(this);

rbd.setText("D." + items.get(itemDIndex));

rg.addView(rba);

rg.addView(rbb);

rg.addView(rbc);

rg.addView(rbd);

rg.setLayoutParams(rp);

svlayout.addView(rg);

// Button 确定答题

RelativeLayout.LayoutParams bp = new RelativeLayout.LayoutParams(

150, RelativeLayout.LayoutParams.WRAP_CONTENT);

bp.topMargin = 8;

bp.leftMargin = 8;

bp.rightMargin = 8;

bp.addRule(RelativeLayout.BELOW, USER_ID + 3);

Button btn = new Button(this);

btn.setId(USER_ID + 4);

btn.setText("确     定");

btn.setLayoutParams(bp);

btn.setOnClickListener(this);

svlayout.addView(btn);

// TextView 是否回答正确提示

RelativeLayout.LayoutParams tpTip = new RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

tpTip.topMargin = 8;

tpTip.leftMargin = 8;

tpTip.rightMargin = 8;

tpTip.addRule(RelativeLayout.BELOW, USER_ID + 4);

TextView tvTip = new TextView(this);

tvTip.setId(USER_ID + 5);

tvTip.setLayoutParams(tpTip);

svlayout.addView(tvTip);

} catch (Exception ex) {

Date d = new Date();

Log.i("err", d.toLocaleString() + ":MillionaireActivity.setLayout error,"

+ ex.getStackTrace());

}

Date d = new Date();

Log.i("info", d.toLocaleString() + ":MillionaireActivity.setLayout complete");

时间: 2024-11-14 02:37:06

android开发步步为营之24:milliondollars游戏技术要点代码生成控件和读取xml文件的相关文章

Android开发系列(十八):自己定义控件样式在drawable目录下的XML实现

在Android开发的过程中,我们常常须要对控件的样式做一下改变,能够通过用添加背景图片的方式进行改变,可是背景图片放多了肯定会使得APK文件变的非常大. 我们能够用自己定义属性shape来实现. shape: gradient   -- 相应颜色渐变. startcolor.endcolor就不多说了. android:angle 是指从哪个角度開始变. solid      --  填充. stroke   --  描边. corners  --  圆角. padding   -- 定义内容

Android开发学习之路--UI之自定义布局和控件

新的一年已经开始了,今天已经是初二了,两天没有学习了,还是要来继续学习下.一般手机的title都是actionbar,就像iphone一样可以后退,可以编辑.这里自定义布局就来实现下这个功能,首先准备下三张图片,一张用来当作背景,两张分别表示后退和编辑.新建工程UICostomViewsTest,然后自动创建工程后,新建title.xml,编写代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearL

Android——spinner控件实现读取xml资源,省、市两级互动

(1)首先在res文件夹下面的values中创建一个省市arrays.xml文件夹,如下 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="province"> <item>-省份-</item> <item>河北省</item> <item>山西省</i

《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述

1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基础环境: ArcGIS for Desktop 10.2.1以上版本 ArcGIS for Server 10.2.1以上版本 使用PostgreSQL.Microsoft SQL Server.或 Oracle 设置企业级地理数据库ArcSDE. 再次在使用同步功能是必须给要素添加GlobleID

《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步

1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出处:http://www.cnblogs.com/gis-luq/p/5858062.html 2.demo实现过程 2.1.Demo UI实现 activity_main.xml <?xml version="1.0" encoding="utf-8"?>

Android开发中出现cannot be resolved to a variable错误,也就是R文件不能生成。

最近开始学过习Android开发,配置完成开发环境后,在创建第一个Android项目就出现了cannot be resolved to a variable错误,也就是R文件不能生成的问题. 以下是从网上找到的解决方法 : Android开发过程中,碰到R cannot be resolved to a variable的报错信息,好像没有很确定的错误原因,一般来说,我总结出几个可能的解决方法,希望试过以后管用... 1. 检查Android 的SDK是否丢失需要重新下载,检查build pat

android 动态背景的实现以及SurfaceView中添加EditText控件

      首先还是一贯作风,我们先看案例: 静态图看不出来效果,如果用过此软件(扎客)的同学们都知道,她的背景会动.怎么样,是不是觉得很时尚,起码比静态的要好(个人观点).其实实现起来并 不复杂,这个如果让做游戏程序员做简直太小儿科了,这里我说明一点,其实我们做应用的也应该多少了解下游戏编程思维,起码对我们做应用有很好的帮助. 下面我简单介绍下实现方式. 实现原理:自定义一个SurfaceView控件.对之不停的onDraw,使得其背景动起来. 对于SurfaceView如果不了解的同学们麻烦

android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)

第三节(2):常用控件之ViewPager.日期时间相关.ListView  一.ViewPager 实例:结合PagerAdapter滑动切换图片  二.日期时间相关:AnalogClock\DigitalClock\DatePicker\TimerPicker\DatePickerDialog\TimePickerDialog 三.ListView 实例1:城市选择器 实例2:自定义列表项 百度网盘视频下载地址:http://pan.baidu.com/s/1c0ip6la android内

android listview和button,ImageButton等有事件的控件的总结

? 1 2 3 4 public ImageButton(Context context, AttributeSet attrs, int defStyle) {     super(context, attrs, defStyle);     setFocusable(true); } 在listview中(或者ExpandableListview),item的view会被进行特殊的处理,通过convertview可以减少解析xml文件,提高效率.但是如果你自己解析一次,然后用变量保存,那么只