美文网首页程序员
android从入门到放弃(2)

android从入门到放弃(2)

作者: 雨中枫灵 | 来源:发表于2018-07-19 20:53 被阅读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

    相关文章

      网友评论

        本文标题:android从入门到放弃(2)

        本文链接:https://www.haomeiwen.com/subject/ytrxmftx.html