安卓 實現一個簡單的計算器

適合新手練習

結果圖:

佈局:外層是相對佈局,內層是網格佈局。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent"
    android:gravity="center"
    tools:context=".MainActivity">
    <GridLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:columnCount="4"
        android:orientation="horizontal"
        android:padding="5dp"
        android:rowCount="6">
            <TextView
                android:layout_columnSpan="4"
                android:background="@drawable/textview_bg"
                android:id="@+id/tv1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:maxLines="1"
                android:ellipsize="end"
                android:singleLine="true"
                android:textSize="50sp"
                >
            </TextView>
        <Button
            android:id="@+id/Del_one"

            android:layout_columnSpan="2"
            android:background="@drawable/delete_bg"

            android:layout_gravity="fill"
            android:layout_marginTop="10dp"
            android:layout_marginRight="3dp"
            android:text="回退">

        </Button>

        <Button
            android:id="@+id/Del_all"
            android:layout_columnSpan="2"
            android:layout_gravity="fill"
            android:layout_marginTop="10dp"
            android:background="@drawable/delete_bg"
            android:layout_marginLeft="3dp"
            android:text="清除">

        </Button>

        <Button android:text="+"
             android:id="@+id/add"
            ></Button>

        <Button android:text="1"
            android:id="@+id/one"
            ></Button>

        <Button android:text="2"
            android:id="@+id/two"
            ></Button>

        <Button android:text="3"
            android:id="@+id/three"
            ></Button>

        <Button android:text="-"
            android:id="@+id/subtract"
            ></Button>

        <Button android:text="4"
            android:id="@+id/four"
            ></Button>

        <Button android:text="5"
            android:id="@+id/five"
            ></Button>

        <Button android:text="6"
            android:id="@+id/six"
            ></Button>

        <Button android:text="*"
            android:id="@+id/multiply"
            ></Button>

        <Button android:text="7"
            android:id="@+id/seven"
            ></Button>

        <Button android:text="8"
            android:id="@+id/eight"
            ></Button>

        <Button android:text="9"
            android:id="@+id/nine"
            ></Button>


        <Button android:text="/"
            android:id="@+id/devide"
            ></Button>

        <Button android:text="."
            android:id="@+id/point"
            ></Button>

        <Button android:text="0"
            android:id="@+id/zero"
            ></Button>

        <Button android:text="="
            android:id="@+id/equal"
            ></Button>
    </GridLayout>


</RelativeLayout>

java文件

package com.example.android_play;

import androidx.appcompat.app.AppCompatActivity;

import android.net.Uri;
import android.os.Bundle;
import android.os.PatternMatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {
    private TextView MyTextView;
    private Button delete_one,delete_all;
    private Button add,subtract,multiply,devide;
    private Button one,two,three,four,five,six,seven,eight,nine,zero;
    private Button point,equal;
    private String s="";
    private int equal_num=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setListener();
    }
    private void setListener(){
        OnClick onClick=new OnClick();
        MyTextView=this.findViewById(R.id.tv1);
        MyTextView.setOnClickListener(onClick);
        delete_all=(Button)this.findViewById(R.id.Del_all);
        delete_all.setOnClickListener(onClick);
        delete_one=this.findViewById(R.id.Del_one);
        delete_one.setOnClickListener(onClick);

        add=this.findViewById(R.id.add);
        add.setOnClickListener(onClick);
        subtract=this.findViewById(R.id.subtract);
        subtract.setOnClickListener(onClick);
        multiply=this.findViewById(R.id.multiply);
        multiply.setOnClickListener(onClick);
        devide=this.findViewById(R.id.devide);
        devide.setOnClickListener(onClick);
        one=this.findViewById(R.id.one);
        one.setOnClickListener(onClick);
        two=this.findViewById(R.id.two);
        two.setOnClickListener(onClick);
        three=this.findViewById(R.id.three);
        three.setOnClickListener(onClick);
        four=this.findViewById(R.id.four);
        four.setOnClickListener(onClick);
        five=this.findViewById(R.id.five);
        five.setOnClickListener(onClick);
        six=this.findViewById(R.id.six);
        six.setOnClickListener(onClick);
        seven=this.findViewById(R.id.seven);
        seven.setOnClickListener(onClick);
        eight=this.findViewById(R.id.eight);
        eight.setOnClickListener(onClick);
        nine=this.findViewById(R.id.nine);
        nine.setOnClickListener(onClick);
        zero=this.findViewById(R.id.zero);
        zero.setOnClickListener(onClick);

        point=this.findViewById(R.id.point);
        point.setOnClickListener(onClick);
        equal=this.findViewById(R.id.equal);
        equal.setOnClickListener(onClick);


    }
    public class OnClick implements View.OnClickListener{

        public void display(String str){
            MyTextView.setText(str.trim());
        }
        public String compute(String str){
            StringBuilder stringBuilder=new StringBuilder(str);
            Pattern pattern = Pattern.compile("([\\d.]+)\\s*([*/])\\s*([\\d.]+)");
            Matcher matcher=pattern.matcher(stringBuilder.toString());
            while(matcher.find()){
                Double d1=Double.parseDouble(matcher.group(1));
                Double d2=Double.parseDouble(matcher.group(3));
                Double res=0.0;
                switch (matcher.group(2)){
                    case "*":
                        res=d1*d2;
                        break;
                    case "/":
                        res=d1/d2;
                        break;
                }
                stringBuilder.replace(matcher.start(), matcher.end(), String.valueOf(res));
                matcher.reset(stringBuilder.toString());
                Log.d("edittext",stringBuilder.toString());
            }

            pattern = Pattern.compile("([\\d.]+)\\s*([+-])\\s*([\\d.]+)");
            matcher=pattern.matcher(stringBuilder.toString());
            while(matcher.find()){
                Double d1=Double.parseDouble(matcher.group(1));
                Double d2=Double.parseDouble(matcher.group(3));
                Double res=0.0;
                switch (matcher.group(2)){
                    case "+":
                        res=d1+d2;
                        break;
                    case "-":
                        res=d1-d2;
                        break;
                }
                stringBuilder.replace(matcher.start(), matcher.end(), String.valueOf(res));
                matcher.reset(stringBuilder.toString());
                Log.d("edittext",stringBuilder.toString());
            }
            return stringBuilder.toString();
        }
        private void add_display(String str){
            if(equal_num==1){
                s="";
                equal_num=0;
                display(s);
            }
            s+=str;
            display(s);
        }



        @Override
        public void onClick(View v) {

            switch (v.getId()){
                case R.id.Del_all:
                    s="";
                    display(s);
                    break;
                case R.id.Del_one:
                    if(s.length()!=0)
                    s=s.substring(0,s.length()-1);
                    display(s);
                    break;
                case R.id.add:
                    add_display("+");
                    break;
                case R.id.subtract:
                    add_display("-");
                    break;
                case R.id.multiply:
                    add_display("*");
                    break;
                case R.id.devide:
                    add_display("/");
                    break;
                case R.id.one:
                    add_display("1");
                    break;
                case R.id.two:
                    add_display("2");
                    break;
                case R.id.three:
                    add_display("3");
                    break;
                case R.id.four:
                    add_display("4");
                    break;
                case R.id.five:
                    add_display("5");
                    break;
                case R.id.six:
                    add_display("6");
                    break;
                case R.id.seven:
                    add_display("7");
                    break;
                case R.id.eight:
                    add_display("8");
                    break;
                case R.id.nine:
                    add_display("9");
                    break;
                case R.id.zero:
                    add_display("0");
                    break;
                case R.id.point:
                    add_display(".");
                    break;
                case R.id.equal:
                    String temp=compute(s);
                    Toast.makeText(MainActivity.this,"結果爲:"+temp,Toast.LENGTH_SHORT).show();
                    display(temp);
                    equal_num=1;
                    break;
            }
        }
    }



}

計算的核心思想:將運算表達式存爲字符串類型,單獨處理字符串。

這裏用到了正則表達式,先解析出含有乘號的式子,計算,回填,再處理含有加減的式子。

public String compute(String str){
            StringBuilder stringBuilder=new StringBuilder(str);
            Pattern pattern = Pattern.compile("([\\d.]+)\\s*([*/])\\s*([\\d.]+)");
            Matcher matcher=pattern.matcher(stringBuilder.toString());
            while(matcher.find()){
                Double d1=Double.parseDouble(matcher.group(1));
                Double d2=Double.parseDouble(matcher.group(3));
                Double res=0.0;
                switch (matcher.group(2)){
                    case "*":
                        res=d1*d2;
                        break;
                    case "/":
                        res=d1/d2;
                        break;
                }
                stringBuilder.replace(matcher.start(), matcher.end(), String.valueOf(res));
                matcher.reset(stringBuilder.toString());
                Log.d("edittext",stringBuilder.toString());
            }

            pattern = Pattern.compile("([\\d.]+)\\s*([+-])\\s*([\\d.]+)");
            matcher=pattern.matcher(stringBuilder.toString());
            while(matcher.find()){
                Double d1=Double.parseDouble(matcher.group(1));
                Double d2=Double.parseDouble(matcher.group(3));
                Double res=0.0;
                switch (matcher.group(2)){
                    case "+":
                        res=d1+d2;
                        break;
                    case "-":
                        res=d1-d2;
                        break;
                }
                stringBuilder.replace(matcher.start(), matcher.end(), String.valueOf(res));
                matcher.reset(stringBuilder.toString());
                Log.d("edittext",stringBuilder.toString());
            }
            return stringBuilder.toString();
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章