Android作业二

编写一个简单计算器APP,界面按书上例2-9设计,实现其具体功能:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"  //通过网格布局设置界面
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:rowCount="6"                                                //界面设置为6行4列
    android:columnCount="4"
    tools:context=".MainActivity">

    <TextView                                                           //运算与结果框,默认为0
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnSpan="4"
        android:layout_marginLeft="4px"
        android:layout_gravity="left"
        android:text="0"
        android:textSize="50dip"
        android:id="@+id/sum"
        />
    <Button                                                              //清空按钮
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/delete"
        android:layout_columnSpan="4"
        android:text="delete"
        android:textSize="26sp"/>
    <Button android:id="@+id/btn1"                                       //以下为计算器的基本按键,不再赘述
        android:text="+" android:textSize="30sp"/> 
    <Button android:id="@+id/btn2"
        android:text="1" android:textSize="30sp"/>
    <Button android:id="@+id/btn3"
        android:text="2" android:textSize="30sp"/>
    <Button android:id="@+id/btn4"
        android:text="3" android:textSize="30sp"/>
    <Button android:id="@+id/btn5"
    android:text="-" android:textSize="30sp"/>
    <Button android:id="@+id/btn6"
        android:text="4" android:textSize="30sp"/>
    <Button android:id="@+id/btn7"
        android:text="5" android:textSize="30sp"/>
    <Button android:id="@+id/btn8"
        android:text="6" android:textSize="30sp"/>
    <Button android:id="@+id/btn9"
        android:text="*" android:textSize="30sp"/>
    <Button android:id="@+id/btn10"
        android:text="7" android:textSize="30sp"/>
    <Button android:id="@+id/btn11"
        android:text="8" android:textSize="30sp"/>
    <Button android:id="@+id/btn12"
        android:text="9" android:textSize="30sp"/>
    <Button android:id="@+id/btn13"
        android:text="/" android:textSize="30sp"/>
    <Button android:id="@+id/btn14"
        android:text="." android:textSize="30sp"/>
    <Button android:id="@+id/btn15"
        android:text="0" android:textSize="30sp"/>
    <Button android:id="@+id/btn16"
        android:text="=" android:textSize="30sp"/>
</GridLayout>

MainActivity.java

package com.example.calculator;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {  
    public Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10, btn11, btn12, btn13, btn14, btn15, btn16, delete;                                                   //声明各个按键
    public TextView txt;                                         //声明结果框
    public String str = "";                                      //声明一个字符串,用于在结果框中显示

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txt = (TextView) findViewById(R.id.sum);                 //各个按键与xml中的按钮建立连接
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);
        btn3 = (Button) findViewById(R.id.btn3);
        btn4 = (Button) findViewById(R.id.btn4);
        btn5 = (Button) findViewById(R.id.btn5);
        btn6 = (Button) findViewById(R.id.btn6);
        btn7 = (Button) findViewById(R.id.btn7);
        btn8 = (Button) findViewById(R.id.btn8);
        btn9 = (Button) findViewById(R.id.btn9);
        btn10 = (Button) findViewById(R.id.btn10);
        btn11 = (Button) findViewById(R.id.btn11);
        btn12 = (Button) findViewById(R.id.btn12);
        btn13 = (Button) findViewById(R.id.btn13);
        btn14 = (Button) findViewById(R.id.btn14);
        btn15 = (Button) findViewById(R.id.btn15);
        btn16 = (Button) findViewById(R.id.btn16);
        delete = (Button) findViewById(R.id.delete);
        btn1.setOnClickListener(new click());                    //建立触发器
        btn2.setOnClickListener(new click());
        btn3.setOnClickListener(new click());
        btn4.setOnClickListener(new click());
        btn5.setOnClickListener(new click());
        btn6.setOnClickListener(new click());
        btn7.setOnClickListener(new click());
        btn8.setOnClickListener(new click());
        btn9.setOnClickListener(new click());
        btn10.setOnClickListener(new click());
        btn11.setOnClickListener(new click());
        btn12.setOnClickListener(new click());
        btn13.setOnClickListener(new click());
        btn14.setOnClickListener(new click());
        btn15.setOnClickListener(new click());
        btn16.setOnClickListener(new click());
        delete.setOnClickListener(new click());
    }

    class click implements OnClickListener {                    //创建触发事件
        public void onClick(View v) {
            double a,b,c;                                       //声明Double abc用于字符串转化为数字和计算
            String [] arr;                                      //用于承载spilt函数分解的字符串数组
            switch (v.getId()) {                                //分别按下的按钮
                case R.id.btn1:
                    txt.setText(str=str+"+" );                  //用户按下按钮后,结果框内的字符串加上加号,下面的也类似
                    break;
                case R.id.btn2:
                    txt.setText(str=str+"1" );
                    break;
                case R.id.btn3:
                    txt.setText(str=str+"2");
                    break;
                case R.id.btn4:
                    txt.setText(str=str+"3");
                    break;
                case R.id.btn5:
                    txt.setText(str=str+"-");
                    break;
                case R.id.btn6:
                    txt.setText(str=str+"4");
                    break;
                case R.id.btn7:
                    txt.setText(str=str+"5");
                    break;
                case R.id.btn8:
                    txt.setText(str=str+"6");
                    break;
                case R.id.btn9:
                    txt.setText(str=str+"*");
                    break;
                case R.id.btn10:
                    txt.setText(str=str+"7");
                    break;
                case R.id.btn11:
                    txt.setText(str=str+"8");
                    break;
                case R.id.btn12:
                    txt.setText(str=str+"9");
                    break;
                case R.id.btn13:
                    txt.setText(str=str+"/");
                    break;
                case R.id.btn14:
                    txt.setText(str=str+".");
                    break;
                case R.id.btn15:
                    txt.setText(str=str+"0");
                    break;
                case R.id.btn16:                                 //等号对应的事件,利用contains函数分别运算的类型               
                    if(str.contains("+")) {arr=str.split("\\+"); //利用spilt方法将两个运算的数字提取出来,转化为数字
                    a=Double.parseDouble(arr[0]); b=Double.parseDouble(arr[1]);c=a+b; //数字运算
                    txt.setText(String.valueOf(c));}                                  //数字转化为字符串,输出结果
                    if(str.contains("-")) {arr=str.split("-");
                        a=Double.parseDouble(arr[0]); b=Double.parseDouble(arr[1]);c=a-b;
                        txt.setText(String.valueOf(c));}
                    if(str.contains("*")) {arr=str.split("\\*");
                        a=Double.parseDouble(arr[0]); b=Double.parseDouble(arr[1]);c=a*b;
                        txt.setText(String.valueOf(c));}
                    if(str.contains("/")) {arr=str.split("/");
                        a=Double.parseDouble(arr[0]); b=Double.parseDouble(arr[1]);c=a/b;
                        txt.setText(String.valueOf(c));}
                    break;
                case R.id.delete:                                //删除键对应的事件,将结果框归空,字符串归空
                {txt.setText(""); str="";}
                    break;
            }
        }
    }
}

结果图:

日志:

在按照课本例题设置计算器界面后,发现删除键过长,普通按键太小而不美观,因此更改了按键的大小,使其更加整齐、并且更改了按键的顺序,让他更好操作。

在Activity的实现上,初步想法是通过按键输入相应的数字,运算符号,再将算式通过结果框输出,然后再将字符串中的数字剥离,进行运算。然而,在实现中,为了减少click方法的创造,多个按键使用同一个触发方法。这导致方法里必须分别按的是哪一个按键,这时候逐个逐个用if语句来判断是不现实的,因此用了switch语句实现该功能。实现了字符串的输出,又该面临如何将数字剥离出来和判别运算方式的问题。一开始,为了实现多项式的运算,我特地翻看了正则表达式,苦恼如何建立运算规则。后来发现多项式运算还是由二项式相加的来,于是简化了规则。每次只进行二项式运算,虽然简单,但也实现了功能。至于剥离和判别运算方式则用spilt方法和if方法实现。

猜你喜欢

转载自blog.csdn.net/Lxin12138/article/details/88617519