第27篇 Android Studio无括号计算器(一)布局及算式问题说明

  • 1.需求说明
  • 1.1.计算器样式
  • 1.2.算式输入问题
  • 1.3.layout_main.xml布局代码


1.需求说明

无括号计算器目的就是实现能够计算3+6*8-8/2+6+9这样的算式,因为不包括括号,所以比较好实现,当然就算有括号也可以很好实现,因为学数据结构时学过算式中括号的处理方法。

1.1.计算器样式

androidstudio 计算器代码 android studio编写计算器布局_运算符


计算器的界面效果如上图。

如上一篇所说,我目前使用的都是线性布局。

这个计算器的界面,整体上是一个垂直布局V1。

然后下面一排排的涉及水平布局和垂直布局。

首先:

第一排C,D,*,/是一个水平布局H1。

第二排7,8,9,+是一个水平布局H2。

第三排4,5,6,-是一个水平布局H3。

然后:

要使‘=’号占两行,‘0’占两列。则可使1,2,3,0,.,=这六个符号是在一个水平布局内H4,而’='号独占一列,1,2,3,0,.,在一个垂直布局V2内,而且,1,2,3独自在一个水平布局内H5,0,.独自在一个水平布局H6内。

那么我们可以看出,有6个水平布局,2个垂直布局。

<V1
    EditText//输入框
    <H1
        C D * /
    </H1>
    <H2
        7 8 9 +
    </H2>
    <H3
        4 5 6 -
    </H3>
    <H4
        <V2
            <H5
                1 2 3
            </H5>
            <H6
                0 .
            </H6>
        </V2>
        =
    </H4>
</v1>

在.xml文件中布局就是这样了。

1.2.算式输入问题

因为没有添加括号,所以就只能解决简简单单单点的算式,比如:
23+2+38+9/3;
-8+28/7+3
4-23-43;等。

问题(1):式子为9++6含多个运算符连在一起

怎么解决这个问题呢,既然计算简单的式子,那么就可以设置不能输入多个运算符,那么在输入运算符时,我们先获取式子的最后一个字符,如果该字符为运算符或者‘.’,则不在式子后加入刚输入的运算符,若该字符为数字,则我们在式子尾部加入刚输入的运算符。

String str_end = str_formula.substring(str_formula.length() - 1);
boolean end_isOperator = str_end.equals("+") || str_end.equals("-")||str_end.equals("*")||str_end.equals("/");
if(!end_isOperator){
    Button btn_char = findViewById(view.getId());
    String str_endChar = btn_char.getText().toString();
    str_formula = str_formula + str_endChar;
    edit_formula.setText(str_formula);
}

问题(2):式子中4.4.4.4.22数字多个小数点

如果不设置的话,输入的时候是会出现这样的情况的,如果不小心输入,那么计算时就会出现不必要的错误,因为把字符串转成数字时,会使运行出错。
首先我们能够输入小数点,那么这个字符串的最后一位肯定是数字。那么我们可以设置输入这个小数点时,先判断它前面的数字是否已经有了小数点,如果没有就加上,有就不加。

String str = before(str_formula.length(),str_formula);//获取最后一个数字的函数,自己写的
int count = 0;
for(int i = 0;i < str.length();i++){
    if(str.charAt(i) == '.'){
        count++;
    }
}
if(count >= 1){
    Toast.makeText(MainActivity.this,"一个数不能使用多个小数点",Toast.LENGTH_SHORT).show();
}
else{
    Button btn_char = findViewById(view.getId());
    String str_endChar = btn_char.getText().toString();
    str_formula = str_formula + str_endChar;
    edit_formula.setText(str_formula);
}

问题(3):负数输入问题

计算中肯定要涉及负数的,但是因为没有括号的问题,只能使得算式中的第一位是数字,其他的不能输入为负数,其他只能作为运算符了。
而第一位可以输入为负数的操作很简单,那就是输入框为空的时候输入就好了。

if(str_formula.equals("")){
    if(view.getId() == R.id.btn_sub){
        Button btn_char = findViewById(view.getId());
        String str_endChar = btn_char.getText().toString();
        str_formula = str_formula + str_endChar;
        edit_formula.setText(str_formula);
    }
    else{
        Toast.makeText(MainActivity.this,"请先输入数字",Toast.LENGTH_SHORT).show();
    }
}

这样就大概把输入的一些问题解决了。
下面给出布局文件代码。

1.3.layout_main.xml布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/edit_formula"
        android:layout_width="270dp"
        android:layout_height="150dp"
        android:textSize="20sp"
        android:autofillHints="1" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_clear"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_clear_name"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_delete"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_delete_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_mul"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_mul_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_div"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_div_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_7"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_7_name"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_8"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_8_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_9"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_9_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_add"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_add_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_4"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_4_name"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_5"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:layout_marginStart="10dp"
            android:text="@string/btn_5_name"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_6"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_6_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
        <Button
            android:id="@+id/btn_sub"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:text="@string/btn_sub_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btn_1"
                    android:layout_width="60dp"
                    android:layout_height="50dp"
                    android:text="@string/btn_1_name"
                    style="@style/Base.CardView"/>
                <Button
                    android:id="@+id/btn_2"
                    android:layout_width="60dp"
                    android:layout_height="50dp"
                    android:layout_marginStart="10dp"
                    android:text="@string/btn_2_name"
                    style="@style/Base.CardView"/>
                <Button
                    android:id="@+id/btn_3"
                    android:layout_width="60dp"
                    android:layout_height="50dp"
                    android:text="@string/btn_3_name"
                    android:layout_marginStart="10dp"
                    style="@style/Base.CardView"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btn_0"
                    android:layout_width="130dp"
                    android:layout_height="50dp"
                    android:text="@string/btn_0_name"
                    style="@style/Base.CardView"/>
                <Button
                    android:id="@+id/btn_point"
                    android:layout_width="60dp"
                    android:layout_height="50dp"
                    android:text="@string/btn_point_name"
                    android:layout_marginStart="10dp"
                    style="@style/Base.CardView"/>
            </LinearLayout>
        </LinearLayout>

        <Button
            android:id="@+id/btn_equal"
            android:layout_width="60dp"
            android:layout_height="100dp"
            android:text="@string/btn_equal_name"
            android:layout_marginStart="10dp"
            style="@style/Base.CardView"/>
    </LinearLayout>

</LinearLayout>

代码也不多,如果想添加什么效果的话自行添加就好。