程序员

android从入门到放弃(2)

2018-07-19  本文已影响0人  雨中枫灵

实验一 计算器APP实验

一、目的:
1、熟悉Android程序的生命周期;2、掌握Android界面设计和控件使用;3、掌握Android事件处理方法。
二、内容:
设计与实现计算器APP,具有以下功能:1、输入两个操作数,输出运算结果;2、能进行加减乘除运算;3、清空操作数和运算结果;4、输入错误时能回退一个字符。
三、设计与实现
界面设计思路:


主界面

需要一个EditText来显示输入输出。
网格布局使界面更加整齐,加入back,和倒数功能。
感觉太空了,之后又加了一个标题。
有一点不足就是按钮在网格布局里没有自动适应布局,左右不对称,试了很多种方式都不就行,就这样吧。
为了防止用户按的第一个按钮是运算符号,editText里默认显示的是0。同样在点击DEL时,显示0。
后来为了解决效果展示的问题,加入了历史记录

界面代码如下:
<?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_parent"
    android:orientation="vertical"
    android:padding="20dp">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="简单的计算器"
        android:textAlignment="center"
        android:textColor="#222"
        android:textSize="30sp" />
    <EditText
        android:id="@+id/edt_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:cursorVisible="false"
        android:gravity="right"
        android:text="0"
        android:textSize="28sp" />
    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnCount="4"
        android:rowCount="5">
        <Button
            android:id="@+id/btn_back"
            android:text="back"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_cx"
            android:text="CX"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_del"
            android:text="del"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_add"
            android:text="+"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n7"
            android:text="7"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n8"
            android:text="8"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n9"
            android:text="9"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_div"
            android:text="/"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n4"
            android:text="4"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n5"
            android:text="5"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n6"
            android:text="6"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_mul"
            android:text="*"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n1"
            android:text="1"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n2"
            android:text="2"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n3"
            android:text="3"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_sub"
            android:text="—"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_poi"
            android:text="."
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_n0"
            android:text="0"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_dao"
            android:text="1/"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_cal"
            android:text="="
            android:textSize="20sp" />
    </GridLayout>
    <TextView
    android:id="@+id/tev_his"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="15dp"
    android:text="历史记录:"
    android:textSize="22sp"/>
</LinearLayout>

逻辑设计思路:由于输入错误时能回退一个字符,光用editText.setText(某个常量)很难实现,需要声明一个String变量numlist用来保存之前已经输入的部分,这样回退一个字符只要用substring操作String就行了,让后配合editText.setText()来显示,如下:

case R.id.btn_n1:
    numlist+='1';
    editText.setText(numlist);
    break;

当按下运算符时,需要保存第一个操作数,所以需要声明一个float类型的num1来保存操作数一,如下:

case R.id.btn_add:
    num1=Float.parseFloat(editText.getText().toString());

当按下=号的时候,需要判断之前输入的操作符是什么,所以我声明一个char类型的cal来保存之前的运算符,在按下运算符的时候给cal赋值,当第一次按下+号,然后接着按下-号,cal的值就是-号,用于用户输入错误时可以更改运算符。

case R.id.btn_add:
    num1=Float.parseFloat(editText.getText().toString());
    cal='+';
    numlist="";
    break;

为了使代码更清晰,声明float类型的num2来保存运算结果,运算结束后把numlist=””,如果用户在=号之后按下数字,numlist就等于数字,程序正常运行,当用户接着按的是运算符号,在editText显示的是上次的结果,第一个操作数num1就为上次的结果,程序也正常。

case R.id.btn_cal:
    //判断是否输入第二个操作数
    if(numlist.length()!=0)
    {
        switch (cal){
            case '+':
                num2=num1+Float.parseFloat(numlist);
                editText.setText(String.valueOf(num2));
                break;
            case '-':
                num2=num1-Float.parseFloat(numlist);
                editText.setText(String.valueOf(num2));
                break;
            case '*':
                num2=num1*Float.parseFloat(numlist);
                editText.setText(String.valueOf(num2));
                break;
            case '/':
                num2=num1/Float.parseFloat(numlist);
                editText.setText(String.valueOf(num2));
                break;
        }
        numlist="";
    }
    break;

当按下DEL时程序需要恢复到刚开始的状态,只要改一下变量的值就行,设计如下:

case R.id.btn_del:
    numlist="";
    editText.setText(numlist);
    num1=0;
    num2=0;
    break;

当按下倒数的功能时,相当于一次运算,直接将editText里的内容运算后显示就行。运算后需要把numlist=””。

case R.id.btn_dao:
    num1=1/Float.parseFloat(editText.getText().toString());
    editText.setText(String.valueOf(num1));
    numlist="";
    break;

经过测试之后,实现基本的操作已经没有问题。

四、遇到的问题

由于保存用户输入数字的是numlist,所以开始我写的代码是:

case R.id.btn_add:
    num1=Float.parseFloat(numlist);
    cal='+';
    numlist="";
    break;

当用户点了两次加号时,第一次点击numlist=””,第二次点击,num1就会等于空,会出错,这时在editText显示的并没有改变,所以选择editText显示的复制给num1。
当用户输入的数字后一直按撤销(CX),发现程序崩溃了,代码如下。

case R.id.btn_cx:
        numlist=numlist.substring(0,numlist.length()-1);
        editText.setText(numlist);
    }

原因是当numlist=””时,在执行numlist=numlist.substring(0,numlist.length()-1);时,numlist已经为零,不能再撤销。之后更改如下:

case R.id.btn_cx:
    //防止一直按撤销或按等于后再按撤销,editText还是显示结果的问题
    if(numlist.length()==0){
        editText.setText(numlist);
        break;
    }
    else{
        numlist=numlist.substring(0,numlist.length()-1);
        editText.setText(numlist);
        break;
    }

后来又发现了一个bug,就是输入不止一次’.’的时候,会显示很多很多的点,运算会崩溃。后来修改如下:

case R.id.btn_poi:
    if (numlist.indexOf('.')>=0)
    {
        editText.setText(numlist);
        break;
    }
    else
    {
        numlist+='.';
        editText.setText(numlist);
        break;
    }

鄙人代码
链接:https://pan.baidu.com/s/13b34Nu2h3K4zi93JuV-qFw 密码:zej6

上一篇 下一篇

猜你喜欢

热点阅读