手把手教你做安豆计算器(三)-计算器功能实现

第4节 计算器功能实现

这一节我们将实现计算器的功能。在实现的过程中,可以随时将修改的代码部署到设备上,看看实际的效果。

4.1 添加按钮响应

按钮是需要在用户点击的时候做出响应的。每当用户点击一下按钮,我们就需要更新一下显示区域,或者采取一个动作。

  1. 在布局文件中,给所有Button控件的android:onClick属性设置一个响应函数,这里我们给这个相应函数也取名叫做onClick

    <TableRow android:layout_weight="1">
        <Button android:id="@+id/btn_c" android:text="C"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:onClick="onClick"/>
        <Button android:id="@+id/btn_del" android:text="DEL"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:onClick="onClick"/>
        <Button android:id="@+id/btn_div" android:text="/"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:onClick="onClick"/>
    </TableRow>
  2. MainActivity.java的源代码当中,添加对应的onClick()函数方法。这个方法声明为public,返回值为void,传入的参数是View,这个View就是被点击的对象;

    public void onClick(View view) {
    
    }
  3. 每次点击的是哪个按钮,可以用按钮的android:id来区分。在代码中,id通过Android Studio自动编译生成的R-资源类来访问,形如R.id.xxx;而获取一个Viewid,可以通过view.getId()

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_0:
            case R.id.btn_1:
            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:
            case R.id.btn_add:
            case R.id.btn_sub:
            case R.id.btn_mul:
            case R.id.btn_div:
            case R.id.btn_dot: 
            case R.id.btn_c:
            case R.id.btn_del:
            case R.id.btn_equ:
            break;
        }
    }
  4. 为了验证按钮响应是否其作用,可以在onClick()函数中使用Toast;在设备上运行之后,就会发现,每点击一次按钮,就会弹出一个小框,提示“onClick”;

    public void onClick(View view) {
            ......
            Toast.makeText(this, "onClick", Toast.LENGTH_SHORT).show();
    }

4.2 表达式输入功能

当用户点击数字键(0-9和.)以及运算符键(+-*/)时,需要将它们对应的符号显示到表达式区域。

  1. view转换成Button类型,通过ButtongetText()方法,获取按钮上的字符;
  2. 通过Activity的findViewById()方法获取表达式区域;在通过表达式区域TextViewgetText()方法,获取已经显示在表达式区域上的内容;
  3. 把按钮代表的字符,添加到表达式内容的最后;
  4. 把新的表达式内容,通过TextViewsetText()方法,显示到表达式区域上。
public void onClick(View view) {

        switch (view.getId()) {
            case R.id.btn_0:
            case R.id.btn_1:
            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:
            case R.id.btn_add:
            case R.id.btn_sub:
            case R.id.btn_mul:
            case R.id.btn_div:
            case R.id.btn_dot: {
                Button btn = (Button) view;
                String strAdded = btn.getText().toString();
                TextView formula = (TextView) findViewById(R.id.formula_area);
                String strContent = formula.getText().toString();
                String strNewContent = strContent + strAdded;
                formula.setText(strNewContent);
            }
            break;
            ......
        }
}

4.3 显示区域清除功能

当用户点击“C”按钮的时候,清空显示区域的内容和结果区域的内容。

  1. 通过Activity的findViewById()方法,分别获取表达式区域和结果区域;
  2. 通过TextViewsetText()方法,分别为它们设置空字符串。
public void onClick(View view)
    {
        switch (view.getId()) {
            ......
            case R.id.btn_c: {
                TextView formula = (TextView) findViewById(R.id.formula_area);
                formula.setText("");

                TextView result = (TextView) findViewById(R.id.result_area);
                result.setText("");
            }

            break;
            ......
        }
    }

当用户点击“DEL”按钮的时候,删除表达式内容的最后一个字符。

  1. 获取表达式区域的内容;
  2. 如果表达式区域是空的,没有字符串,就不管它;否则利用String类的subString()方法,截取最后一个字符之前的所有内容;
  3. 将最新截取的内容,设置到表达式区域里。
public void onClick(View view)
    {
        switch (view.getId()) {
            ......
            case R.id.btn_del: {
                TextView formula = (TextView) findViewById(R.id.formula_area);
                String strContent = formula.getText().toString();
                if (strContent.length() > 0) {
                    strContent = strContent.substring(0, strContent.length() - 1);
                    formula.setText(strContent);
                }
            }
            break;        
        }
    }

4.4 等于功能

当用户点击“”按钮的时候,开始计算。

4.4.1 引入第三方库

我们将使用第三方计算库Arity对表达式进行计算。Arity库文件可以在安豆网提供的下载地址进行下载。

下载完成后,

  1. 将下载的arity-2.1.2.jar复制到项目工程所在的Calulator\app\libs目录下,如果这个目录不存在,就自己创建一个;
  2. 在Android Studio左边的项目浏览区,选择Project视图;
  3. app->libs->arity-2.1.2,jar上点击右键,选择Add as Library...
  4. 在弹出的选择框中,点击OK

4.4.2 使用第三方库

利用第三方库,对运算表达式进行计算,

  1. 获取表达式区域的内容;
  2. 创建第三方库Arity提供的Symbols对象,使用它的evl()方法,计算表达式的内容;
  3. 将计算结果显示到计算结果区域,并清空表达式区域;
  4. 如果Arity不能根据提供的计算表达式进行计算,会抛出异常。因此使用try...catch抓住异常,用Toast类给用户一个内容为错误!的提示。
public void onClick(View view)
    {
        switch (view.getId()) {
            ......
            case R.id.btn_equ: {
                TextView formula = (TextView) findViewById(R.id.formula_area);
                String strContent = formula.getText().toString();

                try {
                    Symbols s = new Symbols();
                    double res = s.eval(strContent);

                    TextView result = (TextView) findViewById(R.id.result_area);
                    result.setText(String.valueOf(res));

                    formula.setText("");

                } catch (SyntaxException e) {
                    Toast.makeText(MainActivity.this, "错误!", Toast.LENGTH_SHORT).show();
                }
            }
            break;       
        }
    }

至此,一个具有计算功能的计算器就已经出现了。


/*******************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。

*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值