




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Androidstudio怎么实现简单计算器
这篇文章将为大家详细讲解有关Androidstudio怎么实现简单计算器,在下觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。具体内容如下需求分析在Androidstudio中设计并实现一个简单的计算器,实现连续的加减乘除运算。界面设计采用网格GridLayout布局,设计了一个6行4列的网格,最上边是一个EditText用来显示用户输入的运算数字和运算符,以及相关的运算结果,其占4列,文本框大小为50dip;依次往下的界面分别设置了数字和运算符以及操作的按钮,各行各列的每个按钮的大小均设为26sp。编程分析设计了两个文件:1、控制文件MainActivity.java,完成按钮的处理事件以及实现加减乘除及其结果输出的功能,主要包括:显示activity_main.xml定义的用户界面;与用户界面程序中的组件建立关联,并分别为每个组件注册并实现监听接口;根据具体输入和条件进行运算并显示结果等。2、布局文件activity_main.xml,完成计算器界面的网格布局设计,包括了一个文本编辑框和18个按钮。具体进度第1天:对简单计算器进行系统的功能和界面分析,形成自己大致的设计想法,然后根据老师建议的书本程序以及自己上网搜索的安卓项目的编程,系统地总结出自己编程的过程以及开始理解各类代码。由于对移动编程这门课还不是很熟悉,所以对其中编程部分的理解为自己往后调试程序有很大的帮助。第2天:开始敲代码。由于第一次在Androidstudio上面编程,对这个软件的各项操作都不熟悉,所以刚开始就在软件摸索上面花费了较多的时间。由于此次设计的界面老师给了我们书本的模板,所以我选择从简单的布局文件的设计开始编程,一方面也方便自己熟悉Androidstudio。第3天:开始根据自己的理解和想法开始设计并调试控制文件的程序。由于这部分设计到多种函数以及接口的设计以及实现,运用的是java,由于对过去学的java语言有些遗忘了,而且现在还要涉及关于新知识.xml的结合,所以在这部分花的时间比较长。期间出现了较多的bug,虽然调试起来很吃力,但最终一点点把程序调试成功还是挺开心的。第4天:原本以为程序调试成功就好了,但是没想到最后在AVD的各种选择和配置、调用问题上花了更多的时间和精力。由于第一次接触Androidstudio,所以对其中很多配置都不了解,也是第一次听说AVD,在最终运行这个计算器APP的时候在AVD的选择和配置失败上卡了较长时间,通过百度以及请教同学,一步步地终于把最后这一步做好了。至此便完成了自己第一个简单APP的开发。心得体会这是我的第一个安卓项目开发,这个计算器代码的逻辑都比较简单,然后其功能也很不完善,是一个比较粗糙的设计。即便如此,由于自己对Androidstudio应用程序设计的知识掌握得也不是很好,编程能力也比较弱,所以还是花了比较多的时间去研究和体会。但是,也正因为期间遇到的很多困难和bug,在自己一点点去设法解决的过程中也对这门课程的理论知识以及相关操作都有了更清晰的了解,现在明白了其中和大致框架和原理,为往后深入的学习和编程做好多一点基础巩固。控制文件MainActivity.javapackage
com.example.df.firstapp;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.Button;
//引用按钮组件
import
android.widget.EditText;
//引用文本编辑框组件
import
android.text.TextUtils;
//TextUtils类用于处理字符串
//定义实现监听接口的类MainActivity
public
class
MainActivity
extends
AppCompatActivity
implements
View.OnClickListener
{
//声明17个按钮和一个文本编辑框
Button
bt_num0,bt_num1,bt_num2,bt_num3,bt_num4,bt_num5,bt_num6,bt_num7,
bt_num8,bt_num9,bt_delete,bt_div,bt_mult,bt_minus,bt_plus,bt_equal,bt_dot,bt_clear;
private
EditText
et_calc;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//显示activity_main.xml定义的用户界面
initViewAndListener();
//调用函数initViewAndListener()
}
//定义函数initViewAndListener(),用于与用户界面程序中的组件建立关联,并分别注册监听接口
private
void
initViewAndListener()
{
bt_num0
=
(Button)findViewById(R.id.bt_num0);
bt_num0.setOnClickListener(this);
bt_num1
=
(Button)findViewById(R.id.bt_num1);
bt_num1.setOnClickListener(this);
bt_num2
=(Button)
findViewById(R.id.bt_num2);
bt_num2.setOnClickListener(this);
bt_num3
=
(Button)findViewById(R.id.bt_num3);
bt_num3.setOnClickListener(this);
bt_num4
=
(Button)findViewById(R.id.bt_num4);
bt_num4.setOnClickListener(this);
bt_num5
=
(Button)findViewById(R.id.bt_num5);
bt_num5.setOnClickListener(this);
bt_num6
=
(Button)findViewById(R.id.bt_num6);
bt_num6.setOnClickListener(this);
bt_num7
=
(Button)findViewById(R.id.bt_num7);
bt_num7.setOnClickListener(this);
bt_num8
=
(Button)findViewById(R.id.bt_num8);
bt_num8.setOnClickListener(this);
bt_num9
=
(Button)findViewById(R.id.bt_num9);
bt_num9.setOnClickListener(this);
bt_delete
=
(Button)findViewById(R.id.bt_delete);
bt_delete.setOnClickListener(this);
bt_div
=
(Button)findViewById(R.id.bt_div);
bt_div.setOnClickListener(this);
bt_mult
=
(Button)findViewById(R.id.bt_mult);
bt_mult.setOnClickListener(this);
bt_minus
=
(Button)findViewById(R.id.bt_minus);
bt_minus.setOnClickListener(this);
bt_plus
=
(Button)findViewById(R.id.bt_plus);
bt_plus.setOnClickListener(this);
bt_equal
=
(Button)findViewById(R.id.bt_equal);
bt_equal.setOnClickListener(this);
et_calc
=
(EditText)findViewById(R.id.et_calc);
bt_dot
=
(Button)findViewById(R.id.bt_dot);
bt_dot.setOnClickListener(this);
bt_clear
=
(Button)findViewById(R.id.bt_clear);
bt_clear.setOnClickListener(this);
}
private
boolean
lastIsOperator;
//记录当前是否进行计算操作
private
String
lastOperators
=
"";
//记录上一次进行计算操作的结果
private
double
firstNumber
=
0D;
//定义并初始化第一次的取值
private
double
sencondNumber
=
0D;
//定义并初始化第二次的取值
//onClick()方法,触发OnClickListener接口
public
void
onClick(View
v)
{
String
currentText
=
et_calc.getText().toString();
//获取当前文本编辑框的内容
String
operatorNumber
=
"";
//定义并初始化操作数为””
if
(currentText.equals("0"))
{
//若当前输入数为0则设置文本编辑框为””
et_calc.setText("");
}
operatorNumber
=
et_calc.getText().toString();
//根据编辑框的内容更改操作数值
if(!lastOperators.equals(""))
//判断上一次操作的数是否为空,非空则建立索引,随之修改当前操作数
{
int
index
=
operatorNumber.lastIndexOf(lastOperators);
operatorNumber
=
operatorNumber.substring(index+1);
}
//分别获取按钮的内容至文本编辑框
switch
(v.getId())
{
case
R.id.bt_num0:
et_calc.setText(et_calc.getText()
+
"0");
lastIsOperator
=
false;
break;
case
R.id.bt_num1:
et_calc.setText(et_calc.getText()
+
"1");
lastIsOperator
=
false;
break;
case
R.id.bt_num2:
et_calc.setText(et_calc.getText()
+
"2");
lastIsOperator
=
false;
break;
case
R.id.bt_num3:
et_calc.setText(et_calc.getText()
+
"3");
lastIsOperator
=
false;
break;
case
R.id.bt_num4:
et_calc.setText(et_calc.getText()
+
"4");
lastIsOperator
=
false;
break;
case
R.id.bt_num5:
et_calc.setText(et_calc.getText()
+
"5");
lastIsOperator
=
false;
break;
case
R.id.bt_num6:
et_calc.setText(et_calc.getText()
+
"6");
lastIsOperator
=
false;
break;
case
R.id.bt_num7:
et_calc.setText(et_calc.getText()
+
"7");
lastIsOperator
=
false;
break;
case
R.id.bt_num8:
et_calc.setText(et_calc.getText()
+
"8");
lastIsOperator
=
false;
break;
case
R.id.bt_num9:
et_calc.setText(et_calc.getText()
+
"9");
lastIsOperator
=
false;
break;
case
R.id.bt_dot:
et_calc.setText(et_calc.getText()
+
".");
lastIsOperator
=
false;
break;
//归零按钮,将当前操作数直接清零
case
R.id.bt_clear:
et_calc.setText("");
lastIsOperator
=
false;
firstNumber=0D;
sencondNumber=0D;
lastOperators="=";
break;
//清除按钮,若当前文本编辑框内容为空,点击一次则删除一个字符串
case
R.id.bt_delete:
if
(TextUtils.isEmpty(et_calc.getText()))
{
return;
}
lastIsOperator
=
false;
et_calc.setText(currentText.substring(0,
currentText.length()
-
1).length()
>
0
?
currentText.substring(0,
currentText.length()
-
1)
:
"0");
break;
//计算按钮,若当前内容非空、或者以及上一次有操作记录且记录不是”=”的情况下,将当前的操作记录设置为+、-、*、/、=
case
R.id.bt_div:
if
((TextUtils.isEmpty(et_calc.getText())
||
lastIsOperator)
&&
!lastOperators.equals("="))
{
return;
}
opratorCalc(operatorNumber,"÷");
lastIsOperator
=
true;
et_calc.setText(et_calc.getText()
+
"÷");
lastOperators
=
"÷";
break;
case
R.id.bt_mult:
if
((TextUtils.isEmpty(et_calc.getText())
||
lastIsOperator)
&&
!lastOperators.equals("="))
{
return;
}
opratorCalc(operatorNumber,"*");
lastIsOperator
=
true;
et_calc.setText(et_calc.getText()
+
"*");
lastOperators
=
"*";
break;
case
R.id.bt_minus:
if
((TextUtils.isEmpty(et_calc.getText())
||
lastIsOperator)
&&
!lastOperators.equals("="))
{
return;
}
opratorCalc(operatorNumber,"-");
lastIsOperator
=
true;
et_calc.setText(et_calc.getText()
+
"-");
lastOperators
=
"-";
break;
case
R.id.bt_plus:
if
((TextUtils.isEmpty(et_calc.getText())
||
lastIsOperator)
&&
!lastOperators.equals("="))
{
return;
}
opratorCalc(operatorNumber,"+");
lastIsOperator
=
true;
et_calc.setText(et_calc.getText()
+
"+");
lastOperators
=
"+";
break;
case
R.id.bt_equal:
double
result
=
0D;
if(TextUtils.isEmpty(lastOperators))
{
return;
}
opratorResult(operatorNumber);
sencondNumber
=
0D;
lastOperators
="=";
lastIsOperator
=
true;
et_calc.setText(et_calc.getText()
+
"\n="
+
String.valueOf(firstNumber));
break;
}
}
//运算函数,按具体操作进行+、-、*、/的运算
private
void
operate(String
operatorNumber)
{
if(sencondNumber
!=
0D)
//计算情况一:第二次输入的数不为0
{
if(lastOperators.equals("÷"))
{
sencondNumber
=
sencondNumber
/
Double.parseDouble(operatorNumber);
firstNumber
=
firstNumber
/
sencondNumber;
}
else
if(lastOperators.equals("*"))
{
sencondNumber
=
sencondNumber
*
Double.parseDouble(operatorNumber);
firstNumber
=
firstNumber
*
sencondNumber;
}
else
if(lastOperators.equals("+"))
{
sencondNumber
=
Double.parseDouble(operatorNumber);
firstNumber
=
firstNumber
+
sencondNumber;
}
else
if(lastOperators.equals("-"))
{
sencondNumber
=
Double.parseDouble(operatorNumber);
firstNumber
=
firstNumber
-
sencondNumber;
}
}
Else
//计算情况二:第二次输入的数为0
{
if(lastOperators.equals("÷"))
{
firstNumber
=
firstNumber
/
Double.parseDouble(operatorNumber);
}
else
if(lastOperators.equals("*"))
{
firstNumber
=
firstNumber
*
Double.parseDouble(operatorNumber);
}
else
if(lastOperators.equals("+"))
{
firstNumber
=
firstNumber
+
Double.parseDouble(operatorNumber);
}
else
if(lastOperators.equals("-"))
{
firstNumber=
firstNumber
-
Double.parseDouble(operatorNumber);
}
}
}
//分别返回计算结果
public
void
opratorResult(String
operatorNumber)
{
operate(operatorNumber);
}
//按当前计算结果进行下一次的数据输入及计算
public
void
opratorCalc(String
operatorNumber,String
currentOprator)
{
if(TextUtils.isEmpty(lastOperators))
{
firstNumber
=
Double.parseDouble(operatorNumber);
return;
}
if(lastOperators.equals(currentOprator))
{
if(lastOperators.equals("÷"))
{
firstNumber
=
firstNumber
/
Double.parseDouble(operatorNumber);
}
else
if(lastOperators.equals("*"))
{
firstNumber
=
firstNumber
*
Double.parseDouble(operatorNumber);
}
else
if(lastOperators.equals("+"))
{
firstNumber
=
firstNumber
+
Double.parseDouble(operatorNumber);
}
else
if(lastOperators.equals("-"))
{
firstNumber
=
firstNumber
-
Double.parseDouble(operatorNumber);
}
return;
}
operate(operatorNumber);
}
}布局文件activity_main.xml<?xml
version="1.0"
encoding="utf-8"?>
<GridLayout
xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="4"
//设置了一个4列6行的网格
android:rowCount="6"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_calc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
//该组件占据4列的位置
android:layout_marginLeft="4px"
android:gravity="left"
android:layout_row="0"
android:background="#eee"
android:textSize="50dip"/>
<Button
android:id="@+id/bt_delete"
android:layout_column="3"
android:layout_row="1"
android:text="清除"
android:textSize="26sp"/>
<Button
android:id="@+id/bt_clear"
android:layout_column="0"
android:layout_row="1"
android:text="归零"
android:textSize="26sp"/>
<Button
android:id="@+id/bt_num1"
android:layout_column="0"
android:layout_row="2"
android:text="1"
android:textSize="26sp"/>
<Button
android:id="@+id/bt_num2"
android:layout_column="1"
android:layout_row="2"
android:text="2"
android:textSize="26sp"/>
<Button
android:id="@+id/bt_num3"
android:layout_column="2"
android:layout_row="2"
android:text="3"
android:textSize="26sp"/>
<Button
android:id="@+id/bt_plus"
android:layout_column="3"
android:layout_row="2"
android:text="+"
android:textSize="26sp"/>
<Button
android:id="@+id/bt_num4"
android:layout_column="0"
android:layout_row="3"
android:text="4"
android:textSize="26sp"
/>
<Button
android:id="@+id/bt_num5"
android:layout_column="1"
android:layout_row="3"
android:text="5"
android:textSize="26sp"/>
<Button
android:id="@+id/bt_num6"
android:layout_column="2"
android:layout_row="3"
android:text="6"
android:textSize="26sp"/>
<Button
androi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 鹤岗市人民医院儿童皮肤病诊疗考核
- 鄂尔多斯市人民医院感染科医疗质量控制考核
- 忻州市人民医院肺功能急诊检查考核
- 赤峰市人民医院二维治疗计划设计原理与评估试题
- 2025第二人民医院辐射防护措施考核
- 鄂尔多斯市中医院多模式影像评估考核
- 中国三氧化二钴项目商业计划书
- 2025第三人民医院配置环境监测考核
- 中国一正丁胺项目商业计划书
- 2025年中国纳米银项目创业计划书
- 阿尔茨海默病疾病修饰治疗专家共识(2025版)解读课件
- 国际货物“双清包税”物流服务合同
- 模具测量培训
- 自愿打掉孩子协议书
- 工地安全教育试题及答案
- 2025年地理高考复习 微专题 风(讲义)(解析版)
- 2025至2030中国干洗市场运营状况分析与投资效益创新性报告
- 2024-2025学年部编人教版八年级语文拓展阅读计划
- API RP 17A-2022 海底生产系统的设计和操作-一般要求和建议
- 国际压力性损伤-溃疡预防和治疗临床指南(2025年版)解读
- 应急第一响应人理论考试试卷(含答案)
评论
0/150
提交评论