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,在自己一点点去设法解决的过程中也对这门课程的理论知识以及相关操作都有了更清晰的了解,现在明白了其中和大致框架和原理,为往后深入的学习和编程做好多一点基础巩固。

Android studio实验一——简单计算器的实现

//控制文件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>