广告位联系
返回顶部
分享到

Android studio实现简单计算器的代码

Android 来源:互联网搜集 作者:秩名 发布时间:2020-03-07 20:02:34 人浏览
摘要

需求分析 在Android studio中设计并实现一个简单的计算器,实现连续的加减乘除运算。 界面设计 采用网格GridLayout布局,设计了一个6行4列的网格,最上边是一个EditText用来显示用户输入的运算数字和运算符,以及相关的运算结果,其占4列,文本框大小为50dip

需求分析

在Android studio中设计并实现一个简单的计算器,实现连续的加减乘除运算。

界面设计

采用网格GridLayout布局,设计了一个6行4列的网格,最上边是一个EditText用来显示用户输入的运算数字和运算符,以及相关的运算结果,其占4列,文本框大小为50dip;依次往下的界面分别设置了数字和运算符以及操作的按钮,各行各列的每个按钮的大小均设为26sp。

编程分析

设计了两个文件:1、控制文件MainActivity.java,完成按钮的处理事件以及实现加减乘除及其结果输出的功能,主要包括:显示activity_main.xml定义的用户界面;与用户界面程序中的组件建立关联,并分别为每个组件注册并实现监听接口;根据具体输入和条件进行运算并显示结果等。2、布局文件activity_main.xml,完成计算器界面的网格布局设计,包括了一个文本编辑框和18个按钮。

具体进度

第1天:对简单计算器进行系统的功能和界面分析,形成自己大致的设计想法,然后根据老师建议的书本程序以及自己上网搜索的安卓项目的编程,系统地总结出自己编程的过程以及开始理解各类代码。由于对移动编程这门课还不是很熟悉,所以对其中编程部分的理解为自己往后调试程序有很大的帮助。

第2天:开始敲代码。由于第一次在Android studio上面编程,对这个软件的各项操作都不熟悉,所以刚开始就在软件摸索上面花费了较多的时间。由于此次设计的界面老师给了我们书本的模板,所以我选择从简单的布局文件的设计开始编程,一方面也方便自己熟悉Android studio。

第3天:开始根据自己的理解和想法开始设计并调试控制文件的程序。由于这部分设计到多种函数以及接口的设计以及实现,运用的是java,由于对过去学的java语言有些遗忘了,而且现在还要涉及关于新知识.xml的结合,所以在这部分花的时间比较长。期间出现了较多的bug,虽然调试起来很吃力,但最终一点点把程序调试成功还是挺开心的。

第4天:原本以为程序调试成功就好了,但是没想到最后在AVD的各种选择和配置、调用问题上花了更多的时间和精力。由于第一次接触Android studio,所以对其中很多配置都不了解,也是第一次听说AVD,在最终运行这个计算器APP的时候在AVD的选择和配置失败上卡了较长时间,通过百度以及请教同学,一步步地终于把最后这一步做好了。至此便完成了自己第一个简单APP的开发。

心得体会

这是我的第一个安卓项目开发,这个计算器代码的逻辑都比较简单,然后其功能也很不完善,是一个比较粗糙的设计。即便如此,由于自己对Android studio应用程序设计的知识掌握得也不是很好,编程能力也比较弱,所以还是花了比较多的时间去研究和体会。但是,也正因为期间遇到的很多困难和bug,在自己一点点去设法解决的过程中也对这门课程的理论知识以及相关操作都有了更清晰的了解,现在明白了其中和大致框架和原理,为往后深入的学习和编程做好多一点基础巩固。

控制文件MainActivity.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
package 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/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
  android:id="@+id/bt_minus"
  android:layout_column="3"
  android:layout_row="3"
  android:text="-"
android:textSize="26sp" />
 
 <Button
  android:id="@+id/bt_num7"
  android:layout_column="0"
  android:layout_row="4"
  android:text="7"
android:textSize="26sp"/>
 
 <Button
  android:id="@+id/bt_num8"
  android:layout_column="1"
  android:layout_row="4"
  android:text="8"
android:textSize="26sp"/>
 
 <Button
  android:id="@+id/bt_num9"
  android:layout_column="2"
  android:layout_row="4"
  android:text="9"
android:textSize="26sp" />
 
 <Button
  android:id="@+id/bt_mult"
  android:layout_column="3"
  android:layout_row="4"
  android:text="*"
android:textSize="26sp" />
 
 <Button
  android:id="@+id/bt_dot"
  android:layout_column="0"
  android:layout_row="5"
  android:text="."
android:textSize="26sp" />
 
 <Button
  android:id="@+id/bt_num0"
  android:layout_column="1"
  android:layout_row="5"
  android:text="0"
android:textSize="26sp" />
 
 <Button
  android:id="@+id/bt_equal"
  android:layout_column="2"
  android:layout_row="5"
  android:text="="
android:textSize="26sp" />
 
 <Button
  android:id="@+id/bt_div"
  android:layout_column="3"
  android:layout_row="5"
  android:text="/"
android:textSize="26sp" />
</GridLayout>


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/lxjune1st61/article/details/88619012
相关文章
  • Kotlin的Collection与Sequence操作异同点介绍

    Kotlin的Collection与Sequence操作异同点介绍
    在Android开发中,集合是我们必备的容器,Kotlin的标准库中提供了很多处理集合的方法,而且还提供了两种基于容器的工作方式:Collection 和
  • 实现一个Kotlin函数类型方法

    实现一个Kotlin函数类型方法
    接口与函数类型 业务开发中,经常会有实现一个函数式接口(即接口只有一个方法需要实现)的场景,大家应该都会不假思索的写出如下代
  • Android10 App启动Activity源码分析
    ActivityThread的main方法 让我们把目光聚焦到ActivityThread的main方法上。 ActivityThread的源码路径为/frameworks/base/core/java/android/app/ActivityThread。 1 2
  • Android10客户端事务管理ClientLifecycleManager源码解析

    Android10客户端事务管理ClientLifecycleManager源码解析
    在Android 10 App启动分析之Activity启动篇(二)一文中,简单地介绍了Activity的生命周期管理器是如何调度Activity进入onCreate生命周期的流程。这
  • Kotlin对象的懒加载方式by lazy与lateinit异同介绍

    Kotlin对象的懒加载方式by lazy与lateinit异同介绍
    属性或对象的延时加载是我们相当常用的,一般我们都是使用 lateinit 和 by lazy 来实现。 他们两者都是延时初始化,那么在使用时那么他们两
  • Android类加载流程分析

    Android类加载流程分析
    本文分析的代码基于Android8.1.0源码。 流程分析 从loadClass开始,我们来看下Android中类加载的流程 /libcore/ojluni/src/main/java/java/lang/ClassLoader.ja
  • Android实现读写USB串口数据的代码

    Android实现读写USB串口数据的代码
    最近在研究USB方面的内容;先后做了关于Android读写HID、串口设备的DEMO。本文比较简单,主要介绍的是Android实现读取串口数据的功能 废话不
  • Epoxy - 在RecyclerView中构建复杂界面
    Diffing 对于复杂数据结构支持的多个视图类型展示在屏幕上, Epoxy此时是尤其有用的. 在这些场景中, 数据可能会被网络请求, 异步 Observable, 用
  • Android性能优化的详细介绍

    Android性能优化的详细介绍
    性能优化是一个app很重要的一部分,一个性能优良的app从被下载到启动到使用都能给用户到来很好的体验。自然我们做性能优化也是从被下
  • Android进阶宝典-插件化2(Hook启动插件中四大组件

    Android进阶宝典-插件化2(Hook启动插件中四大组件
    在上一节,我们主要介绍了如果通过反射来加载插件中的类,调用类中的方法;既然插件是一个apk,其实最重要的是启动插件中的Activity、
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计