1、河北科技大学课程设计报告学生姓名: 学 号: 专业班级: 计算机 班 课程名称: Android 智能手机软件开发 学年学期: 2011 学年 第一学期 指导教师: 高凯 2 0 11 年 12 月课程设计成绩评定表学生姓名 学 号 成绩专业班级 起止时间 2011.09-2012.01设计题目 设计编写一个简单的计算器指导教师评语指导教师: 年 月 日一、概述设计编写一个能在 Android 系统下运行的计算器,除了能实现四则运算外,还带有菜单的功能。菜单中拥有的 Item 有: 1 退出键按下时弹出一个对话框提示是否确认退出;2 帮助键按下后显示帮助信息,并能从帮助界面返回到主界面;3Ab
2、out 键按下后弹出就算器的版本信息;4 换肤键按下后更换皮肤。二、项目设计与实现先写好布局文件,代码如下:说明:此 Activity 采用嵌套式 LinearLayout 布局,最外层的 LinearLayout 嵌入六个 LinearLayout,此时LinearLayout 的 android:orientation=“vertical“即采用垂直布局。嵌入的六个 LinearLayout 除第一个采用垂直布局外其他的均采用水平布局。第一个 LinearLayout 控制两个 EditText 的位置,剩下的五个 LinearLayout 控制20 个按钮的布局。为使软件能适应不同分辨率
3、的手机,所有控件的 layout_width 和 layout_height 属性都设为 fill_parent,而控制按钮大小通过设置 layout_weight 的大小来控制。这样控件的大小就只和屏幕大小和控件占屏幕的比例有关。显示效果如下:Activity 的界面计算器的基本功能实现接下来就是对各个按钮绑定监听器,实现算术式的输入功能和计算输入的算术式值的功能。根据各个按钮的功能可将将它们分为四类:Clean 按钮为一类,Delete 为一类,等号按钮为一类,其他的作为基本算式输入按钮可看做一类。由此写四个监听器类,分别实现按钮的各个功能。Clean 功能是清空两个 Edittext 中
4、的内容,实现原理也就是 Clean 按钮绑定的监听器,代码如下:/清除功能class clearListener implements OnClickListenerpublic void onClick(View v) / TODO Auto-generated method stubedittext1.setText(null);edittext2.setText(null);tem=“;tem1=“;Delete 功能相关代码是为:/删除功能,删除之后光标不移动class deleteListener implements OnClickListenerpublic void onCli
5、ck(View v) / TODO Auto-generated method stubint index=edittext1.getSelectionStart();/获得光标位置int l=tem.length();if(l=0|index=0)edittext1.setText(tem);edittext1.setSelection(0);else if(l=1)tem=“;edittext1.setText(tem);elseString tem2=“;tem2=tem.substring(index, l);tem=tem.substring(0,index-1);edittext1
6、.setText(tem+tem2);edittext1.setSelection(tem.length();tem=tem+tem2;/edittext1.setSelection(index-1);点击等号按钮后,能计算输入算式的值并将结果显示在第二个文本框中,实现代码如下:/等号功能class dengListener implements OnClickListenerpublic void onClick(View arg0) / TODO Auto-generated method stubString str=edittext1.getText().toString();Expr
7、essionParser ep=new ExpressionParser(str);try double result=ep.parse();String result_str=String.valueOf(result);edittext2.setText(result_str); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();edittext2.setText(“ERROR“);其中 ExpressionParser 为一个封装类,其实现的功能为计算出用字符串表示的素数表达式的值。计算用字符
8、串表示的计算式的基本原理为:1. 创建两个堆栈,一个用来放数据(numStack) ,一个用来放算术符(chStack) ;2. 从左到右读入算术式,如果读到的是数字,则压入(push)到数据堆栈(numStack)中。若读到的是算术符,先判断 chStack 栈顶元素,若栈顶元素优先级大于读到的算术符,则先将栈顶元素和 numStack中两个数拿出来计算,再将读到的算术符压入 chStack 中,若读到的算术符优先级大于栈顶元素,则将读到的算术符压入 chStack 中。如果读到的是右括号则不断将 chStack 和 numStack 中的内容拿出来计算,直到从chStack 中拿出左括号为
9、止;3. 若读到了算术式的最后,则将两堆栈中的内容全拿出来计算,最后结果放在 numStack 中。这里的左括号的优先级最低,其次为加号和减号,最高为乘号和除号。基本算式输入按钮实现的功能不仅要能输入基本的数字和算术符,还要有简单的纠错功能,如不能连续输入两个小数点、右括号数必须和左括号数对应、不能连续输入两个加减乘除等。Menu 设计使用 Menu 菜单实现退出、查看帮助文档、更换皮肤和查看版本信息的功能,如图 6.12 所示。图 6.12 菜单界面菜单可以采用 xml 实现,先在 res 文件夹中新建 Android XML File,选择 Menu 类型,如图 6.13 所示:图 6.1
10、3 新建 XML 文件之后,此 XML 文件保存在 layout 文件夹下面的 Menu 文件夹下。然后在 menu.xml 文件中添加需要添加的 item,这里添加“Exit” 、 “Help”、 “Skin”、 “About”四个 Item,相关代码如下:Menu 类型的布局文件采用 Linearlayout 布局方式,不能改变,系统自动根据加入 item 的多少设置显示行数,如若本示例中只加入两个按钮,则只会显示一行。当然,只有布局文件是不能在 Activity 中显示Menu 菜单的,还得在主程序中加入相应代码。public boolean onCreateOptionsMenu(Me
11、nu menu) MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu);return super.onCreateOptionsMenu(menu);inflate 方法是菜单层次从一个指定的 xml 资源去填充,这里指定的是前面所写的 menu.xml,如果有错误会抛出 InflateException 信息。接下来就是给各个 item 添加功能了。这里采用调用onOptionsItemSelected(MenuItem item)方法实现。各个 item 实现的功能是:点击“Exit”退
12、出计算器并弹出确认退出对话框;点击“Help”转换 Activity,显示帮助信息;点击 “about”显示计算器版本信息对话框;点击“Skin”跟换计算器皮肤。public boolean onOptionsItemSelected(MenuItem item) / TODO Auto-generated method stubif(item.getItemId()=R.id.exit)/弹出对话框,提示是否退出Builder exitAlert=new AlertDialog.Builder(Calculator.this);exitAlert.setIcon(R.drawable.war
13、ning);exitAlert.setTitle(“Warning“);exitAlert.setMessage(“Are you sure to exit?“);/添加 YES 按钮exitAlert.setNeutralButton(“YES“, new DialogInterface.OnClickListener() public void onClick(DialogInterface arg0, int arg1) / TODO Auto-generated method stub/点击 YES 时退出计算器Calculator.this.finish(););/添加 No 按钮e
14、xitAlert.setNegativeButton(“NO“, new DialogInterface.OnClickListener() public void onClick(DialogInterface arg0, int arg1) / TODO Auto-generated method stub/点击 NO 按钮时什么也不做,默认回到原 Activity);exitAlert.create();/创建对话框exitAlert.show();/显示对话框if(item.getItemId()=R.id.about)/弹出对话框,显示版本信息Builder exitAlert=ne
15、w AlertDialog.Builder(Calculator.this);exitAlert.setIcon(R.drawable.dragon);exitAlert.setTitle(“Dragon 声明:“);exitAlert.setMessage(“绝版产品,个人制作,如有雷同,不属抄袭“);exitAlert.setNegativeButton(“OK“, new DialogInterface.OnClickListener() public void onClick(DialogInterface arg0, int arg1) / TODO Auto-generated m
16、ethod stub);exitAlert.create();exitAlert.show();if(item.getItemId()=R.id.help)Intent intent=new Intent();intent.setClass(Calculator.this,Help.class);Calculator.this.startActivityForResult(intent, 10);if(item.getItemId()=R.id.skin)/更换皮肤,这里只需要更改按钮的图片及背景 if(!changed)Calculator.this.getWindow().getDecor
17、View().setBackgroundColor(Color.GRAY);button0.setImageResource(R.drawable.ling);button1.setImageResource(R.drawable.yi);button2.setImageResource(R.drawable.er);button3.setImageResource(R.drawable.san);button4.setImageResource(R.drawable.si);button5.setImageResource(R.drawable.wu);button6.setImageRes
18、ource(R.drawable.liu);button7.setImageResource(R.drawable.qi);button8.setImageResource(R.drawable.ba);button9.setImageResource(R.drawable.jiu);buttonjia.setImageResource(R.drawable.add);buttonjian.setImageResource(R.drawable.sub);buttoncheng.setImageResource(R.drawable.mul);buttonchu.setImageResourc
19、e(R.drawable.div);buttondeng.setImageResource(R.drawable.equ);buttondian.setImageResource(R.drawable.point);buttonl.setImageResource(R.drawable.zuo);buttonr.setImageResource(R.drawable.you);buttonclean.setImageResource(R.drawable.qingkong);buttondelete.setImageResource(R.drawable.shanchu);changed=tr
20、ue;elseCalculator.this.getWindow().getDecorView().setBackgroundColor(Color.BLACK);button0.setImageResource(R.drawable.zero);button1.setImageResource(R.drawable.one);button2.setImageResource(R.drawable.two);button3.setImageResource(R.drawable.three);button4.setImageResource(R.drawable.four);button5.s
21、etImageResource(R.drawable.five);button6.setImageResource(R.drawable.six);button7.setImageResource(R.drawable.seven);button8.setImageResource(R.drawable.eight);button9.setImageResource(R.drawable.nine);buttonjia.setImageResource(R.drawable.jia);buttonjian.setImageResource(R.drawable.jian);buttonchen
22、g.setImageResource(R.drawable.cheng);buttonchu.setImageResource(R.drawable.chu);buttondeng.setImageResource(R.drawable.deng);buttondian.setImageResource(R.drawable.dian);buttonl.setImageResource(R.drawable.left);buttonr.setImageResource(R.drawable.right);buttonclean.setImageResource(R.drawable.clean
23、);buttondelete.setImageResource(R.drawable.delete);changed=false;return super.onOptionsItemSelected(item) ;按“Exit”和“About”后显示效果如图 6.14 所示:图 6.14 显示效果Java 代码为:package LEO.Calculator;import java.io.InputStream;import org.apache.http.util.EncodingUtils;import android.app.Activity;import android.os.Bund
24、le;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class Help extends Activity implements OnClickListenerprivate Button button;private TextView textView;public void onCreate(Bundle savedInstanceState) String res = “
25、;/初始化显示结果try InputStream in = getResources().openRawResource(R.drawable.text); /创建输入流int length = in.available(); byte buffer = new bytelength; in.read(buffer); /res = EncodingUtils.getString(buffer, “UTF-8“);/res = EncodingUtils.getString(buffer, “UNICODE“); /res = EncodingUtils.getString(buffer, “
26、BIG5“);/繁体中文res = EncodingUtils.getString(buffer, “GB2312“);/简体中文/依 text.txt 的编码类型选择合适的编码,如果不调整会乱码in.close(); catch(Exception e) e.printStackTrace(); super.onCreate(savedInstanceState);setContentView(R.layout.help);button=(Button)findViewById(R.id.docButton);textView=(TextView)findViewById(R.id.docV
27、iew);textView.setText(res);button.setOnClickListener(this);public void onClick(View arg0) / TODO Auto-generated method stubfinish();/关闭此 Activity值得注意的是,采用输入输出流读入文档后,需要根据文档编码类型进行重新编码,不然会显示乱码。三、总结心得体会通过此次课程设计了解了 Android 智能手机软件的开发的基本流程,掌握了 eclipse 的使用方法,也熟悉了 Android 的智能手机软件开发的基本方法。在计算器的设计编写过程中也遇到了很多困难,
28、但通过咨询老师,请教同学以及上网查找资料问题总算都得意解决,在解决问题的过程中学到了很多东西,也巩固了所学知识。编写的过程也是学习的过程,这次课程设计让我了解到学习是需要不断实践的,实践的过程既是巩固医学知识的过程,也是学习新知识的很好的途径。四、参考文献1 高凯.Android 学习文档2匿名网友.给定任意的一个含数学运算符的字符串,怎么求这个字符串转换成数学表达式的值OL.2011-10-10.http:/ Android 的魅力,更无法完成此次课程设计。也感谢和我一起学习的同学,与你们一起学习与讨论问题让我受益匪浅。还得感谢我宿舍的舍友,体谅我在周末时早起,在学习过程中给予我支持与鼓励。