Android studio实现简单计算器

本文实例为大家分享了Android studio实现简单计算器的具体代码,供大家参考,具体内容如下

需求分析

在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

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

<?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>

关于计算器的精彩文章请查看《计算器专题》 ,更多精彩等你来发现!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android studio实现计算器

    本文实例为大家分享了android studio实现计算器的具体代码,供大家参考,具体内容如下 效果图: 资源文件: color.xml <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark&

  • Android Studio实现简易计算器

    如果是制作简易计算器的话是基本没有难点的,供大家参考,具体内容如下 步骤是先写好界面布局,将按钮的布局.字号颜色啥的做好,再就是设置监听器. 使用了NoTitleBar的主题 代码如下: activity_main里关于界面的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a

  • Android开发实现的简单计算器功能【附完整demo源码下载】

    本文实例讲述了Android开发实现的简单计算器功能.分享给大家供大家参考,具体如下: 这个Android计算器虽然还有点小bug,不过简单的计算功能还是没问题的哦: 先上图看效果 比较简单,所以我就没怎么写注释,应该一看就能明白的 有不明白的可以发信问我 先贴MainActivity.java代码 package com.example.calculator; import android.app.Activity; import android.os.Bundle; import andro

  • android计算器代码示例分享

    复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><EditText    android:id="@+id/editText1"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:ems="10&quo

  • 简单实现Android计算器功能

    自己写的安卓的计算器: 注:这个是在mac中开发的,如果要在windows的eclipse中运行可能会出现路径问题,解决办法从windows中已有的安卓工程根目录下复制一下classpath文件,然后复制粘贴覆盖掉这个工程根目录里面的路径文件,再导入工程应该就可以打开了.  安卓计算器Android <wbr>calculator 工程下载链接:https://github.com/jiangxh1992/Android-Calculator 代码: package com.example.c

  • android计时器,时间计算器的实现方法

    需求:默认为"00:00:00",点击开始按钮时清零后开始计时,出现如10:28:34.点击停止的时候停止计时.问题:使用Calendar DateFormat的方法,不设置时区获取到的小时是本地时区的(东八区的就是8),设置成GMT标准时区获取到的时间是12小时(12:00:00),设置24小时制无效.在开始时间加减各种小时都无效,而且计时只能到12小时就自动跳上去了,始终无法出现默认状态00:00:00开始计时的效果.尝试各种时间设置方法无效后只能自己写一个根据秒数转换时间格式字符

  • Android计算器编写代码

    其实这个安卓计算机,所有的后台思想与<C#计算器编写代码>是一模一样的.Win窗体程序移植到安卓,从C#到Java其实很简单的,因为两者的基本语法都很相像,唯一的难点是安卓的xml布局部分,不像C#窗体能够直接拖.  还是如下图一个能够完成基本四则运算的计算器: 先在res\values\strings.xml设置按钮相应的字体,以免布局文件警告满天飞: <?xml version="1.0" encoding="utf-8"?> <r

  • 从零开始学android实现计算器功能示例分享(计算器源码)

    下面是效果展示: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match

  • android计算器简单实现代码

    本文实例为大家分享了android计算器的具体实现代码,供大家参考,具体内容如下 java代码: package com.itheima74.simplecalculator4; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; imp

  • Android中使用GridLayout网格布局来制作简单的计算器App

    关于GridLayout 在android4.0版本之前,如果想要达到网格布局的效果,首先可以考虑使用最常见的LinearLayout布局,但是这样的排布会产生如下几点问题: 1.不能同时在X,Y轴方向上进行控件的对齐. 2.当多层布局嵌套时会有性能问题. 3.不能稳定地支持一些支持自由编辑布局的工具. 其次考虑使用表格布局TabelLayout,这种方式会把包含的元素以行和列的形式进行排列,每行为一个TableRow对象,也可以是一个View对象,而在TableRow中还可以继续添加其他的控件

随机推荐