Android 计算器的简易实现

Github

私以为这个小项目中最难的是逻辑部分
目前资瓷加、减、乘、除、乘方,括号这些操作符
其中减号可以当做负号使用

AC长按清屏

特色:实时结果 数字分隔(100,000)
支持hentai算式 如3×-(-(-6+5)×2)

不足:还未加入自动调节字体大小功能
连续括号问题存在bug


预备知识

Android:控件中Button、Textview / EditText 的使用及布局方式
Java:集合,String及数组的熟练使用
算法:中缀转后缀及后缀表达式的计算 及复杂表达式的处理


UI

我的丑丑的UI是仿写手机中的一个计算器的界面,右边青色的的条条是可以划出来使用很多计算符的。但是还没学到,就先做个条条…

界面使用嵌套的线性布局实现

嵌套线性布局的使用技巧:先把布局块分好,再写控件,不然嵌套的多了,自己就容易写乱

上xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:weightSum="8">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="3"        android:orientation="vertical"        android:weightSum="5">            <EditText                android:id="@+id/text_screen"                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_weight="3"                android:layout_gravity="right"                android:gravity="right"                android:focusable="false"                android:cursorVisible="false"                android:singleLine="true"                android:background="@null"                android:textColor="#666666"                android:textSize="60sp" />            <EditText                android:id="@+id/text_result"                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_weight="2"                android:layout_gravity="right"                android:gravity="right"                android:focusable="false"                android:cursorVisible="false"                android:singleLine="true"                android:background="@null"                android:textColor="#999999"                android:textSize="40sp" />    LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="5"        android:weightSum="10"        android:orientation="horizontal">        <LinearLayout            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="7"            android:orientation="vertical"            android:weightSum="5">            <LinearLayout                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_weight="1"                android:orientation="horizontal"                android:weightSum="3">                <Button                    android:id="@+id/btn_leftBracket"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="("                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_rightBracket"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text=")"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_power"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="^"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>            LinearLayout>            <LinearLayout                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_weight="1"                android:weightSum="3">                <Button                    android:id="@+id/btn_1"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="1"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_2"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="2"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_3"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="3"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>            LinearLayout>            <LinearLayout                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_weight="1"                android:weightSum="3">                <Button                    android:id="@+id/btn_4"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="4"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_5"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="5"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_6"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="6"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>            LinearLayout>            <LinearLayout                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_weight="1"                android:weightSum="3">                <Button                    android:id="@+id/btn_7"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="7"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_8"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="8"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_9"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="9"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>            LinearLayout>            <LinearLayout                android:layout_width="match_parent"                android:layout_height="0dp"                android:layout_weight="1"                android:weightSum="3">                <Button                    android:id="@+id/btn_del"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="."                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_0"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="0"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_calculate"                    android:background="#333333"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="="                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"/>            LinearLayout>        LinearLayout>        <LinearLayout            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="3"            android:weightSum="4">            <LinearLayout                android:orientation="vertical"                android:layout_width="0dp"                android:layout_height="match_parent"                android:layout_weight="3"                android:weightSum="5">                <Button                    android:id="@+id/btn_clear"                    android:background="#666666"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="AC"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_devide"                    android:background="#666666"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="÷"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_multiply"                    android:background="#666666"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="×"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_minus"                    android:background="#666666"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="-"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_weight="1"/>                <Button                    android:id="@+id/btn_plus"                    android:background="#666666"                    android:textColor="#FFFFFF"                    android:textSize="26sp"                    android:text="+"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_weight="1"/>            LinearLayout>            <LinearLayout                android:background="#00FFFC"                android:layout_width="0dp"                android:layout_height="match_parent"                android:layout_weight="1">            LinearLayout>        LinearLayout>    LinearLayout>LinearLayout>

逻辑

写了两个工具类
StringExam类辅助字符串处理,Calculate类进行计算

计算思想,从文本框中取得字符串,检查处理,重点处理– ( )×–÷–,转为后缀表达式再计算

代码太长Github自取


UI与逻辑的交互代码

看到好多学长制造Button注册监听器就写了几十行….
注册监听器可以跟findViewById写到一起
其实看一下R.java中的代码,连着写的控件,id是连着的。而且这部分代码是可修改的。所以用int类型的数就可以批量注册

后面的 switch case也是同理,数字部分明明可以合并,略去好多重复代码

package com.example.hp.calculator;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.method.ScrollingMovementMethod;import android.view.View;import android.widget.TextView;import android.widget.Toast;import java.text.Format;import static com.example.hp.calculator.Calculate.arrange;import static com.example.hp.calculator.StringExam.*;public class InteractActivity extends AppCompatActivity implements View.OnClickListener{    private StringBuffer text = new StringBuffer();    private TextView edit_screen;    private TextView result_screen;    private String s = new String();    private boolean flag = false;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.module_activity_main);        //0x7f070022 ~0032        int id = 0x7f070022;        for(id=0x7f070022;id<=0x7f070034;id++){            findViewById(id).setOnClickListener(this);        }        findViewById(R.id.btn_clear).setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View view) {                text = new StringBuffer();                s = "";                edit_screen.setText("0");                result_screen.setText("");                return false;            }        });        edit_screen = findViewById(R.id.text_screen);        result_screen = findViewById(R.id.text_result);        findViewById(R.id.btn_leftBracket).setOnClickListener(this);        findViewById(R.id.btn_rightBracket).setOnClickListener(this);//        edit_screen.setMovementMethod(ScrollingMovementMethod.getInstance());    }    @Override    public void onClick(View view) {        int textLen = text.length();        switch (view.getId()){            case R.id.btn_0:                if(flag){                    text = new StringBuffer();                    textLen = 0;                }                if(textLen==0||text.charAt(textLen-1)!=')')                    text.append('0');                break;            case R.id.btn_1://0x7f070022            case R.id.btn_2:            case R.id.btn_3:            case R.id.btn_4:            case R.id.btn_5:            case R.id.btn_6:            case R.id.btn_7:            case R.id.btn_8:            case R.id.btn_9:                if(flag){                    text = new StringBuffer();                    textLen = 0;                }                if(textLen==0||text.charAt(textLen-1)!=')')                    text.append((char) ('1'+view.getId()-0x7f070023));                break;                //根据id判断所加字符            case R.id.btn_del:                if(textLen==0)                    text.append("0.");                else if(isNum(text.charAt(textLen-1))&&judgeDel(text.toString())==false)                    text.append('.');                break;            case R.id.btn_leftBracket:                if(textLen==0||(textLen>0&&text.charAt(textLen-1)!='.'&&isNum(text.charAt(textLen-1))==false))                    text.append('(');                    break;            case R.id.btn_rightBracket:                if(cntBrackets(text.toString())>0&&textLen>0&&!isOperation(text.charAt(textLen-1))&&text.charAt(textLen-1)!='.'&&text.charAt(textLen-1)!='(')                    text.append(')');                break;            case R.id.btn_plus:                //if(textLen>0&&!isOperation(text.charAt(textLen-1))&&text.charAt(textLen-1)!='.')                if(textLen>0&&(isNum(text.charAt(textLen-1))||text.charAt(textLen-1)==')'))                    text.append('+');                else if(textLen>0&&cntCharacter(text.toString())==1)                    text.setCharAt(textLen-1,'+');                break;            case R.id.btn_minus://             if(textLen==0||(text.charAt(textLen-1)!='+'&&text.charAt(textLen-1)!='-'&&text.charAt(textLen-1)!='.'))                if(textLen==0)                    text.append('-');                else if(textLen==1){                    if(text.charAt(textLen-1)!='-')                    text.append('-');                }                else if(textLen == 2&&text.charAt(0)=='('){                    if(text.charAt(1)!='-')                        text.append('-');                }                else if(text.charAt(textLen-1)!='.'&&cntCharacter(text.toString())<2||(cntCharacter(text.toString())==2&&(text.charAt(textLen-1)!='-'&&text.charAt(textLen-2)!='-'))||text.charAt(textLen-1)=='(')                    text.append('-');//                if(textLen>0){//                    Toast.makeText(this,String.valueOf(text.charAt(textLen-1)!='.'&&cntCharacter(text.toString())<=2||(textLen==1&&text.charAt(textLen-1)!='-')),Toast.LENGTH_SHORT).show();//                }                break;            case R.id.btn_multiply:                if(textLen>0&&(isNum(text.charAt(textLen-1))||text.charAt(textLen-1)==')'))                    text.append('×');                else if(textLen>0&&cntCharacter(text.toString())==1)                    text.setCharAt(textLen-1,'×');                break;            case R.id.btn_devide:                if(textLen>0&&(isNum(text.charAt(textLen-1))||text.charAt(textLen-1)==')'))                    text.append('÷');                else if(textLen>0&&cntCharacter(text.toString())==1)                    text.setCharAt(textLen-1,'÷');                break;            case R.id.btn_power:                if(textLen>0&&(isNum(text.charAt(textLen-1))||text.charAt(textLen-1)==')'))                    text.append('^');                else if(cntCharacter(text.toString())==1){                    text.setCharAt(textLen-1,'^');                }                break;            case R.id.btn_clear:                if(textLen>0)                    text.deleteCharAt(textLen-1);                if(text.length()==0)                    s="";                break;            case R.id.btn_calculate:                if(!edit_screen.getText().equals(result_screen.getText())){                    flag = true;}                try{                    text = new StringBuffer(s);                 //嘻嘻嘻                    edit_screen.setText(devideByDel(s));                    result_screen.setText("");                } catch (Exception e){                    edit_screen.setText("bug發現,請聯繫開發者kafm。QQ1002605741");                    text = new StringBuffer();                    s = "";                }                break;        }        if(view.getId()!=R.id.btn_calculate){            flag = false;//            String tem = devideByDel();            edit_screen.setText(parseStringAndDevideByDel(text.toString()));//可用正则表达式优化            if(text.length()>0)                s = completeString(text.toString());            if(s.length()>0) {                try {                    s=arrange(s);                } catch (infinityException e) {                    s = "∞";                } catch (Exception e) {//坑                }            }            result_screen.setText(devideByDel(s));        }    }}

2018/8/4

更多相关文章

  1. android EditText设置不可写
  2. android 使用html5作布局文件: webview跟javascript交互
  3. android studio调试c/c++代码
  4. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  5. 锁屏界面
  6. android(NDK+JNI)---Eclipse+CDT+gdb调试android ndk程序
  7. Android(安卓)version and Linux Kernel version
  8. Android(安卓)闹钟管理类的使用
  9. Android学习篇之Menu的使用

随机推荐

  1. Android(安卓)Studio学习1——初始Androi
  2. Android(安卓)控件布局常用属性
  3. 动画Animation ,一点点
  4. android 去掉标题栏 禁止横竖屏 保持全屏
  5. android:gravity与android:layout_gravit
  6. ❤️Android(安卓)从源码解读 Apk 的安装过
  7. Android:GridView+AbsoluteLayout作一个
  8. android startService onStartCommand 多
  9. android 布局属性
  10. Android:GridView+AbsoluteLayout作一个