第4节 计算器功能实现
这一节我们将实现计算器的功能。在实现的过程中,可以随时将修改的代码部署到设备上,看看实际的效果。
4.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>
在
MainActivity.java
的源代码当中,添加对应的onClick()
函数方法。这个方法声明为public
,返回值为void
,传入的参数是View
,这个View
就是被点击的对象;public void onClick(View view) { }
每次点击的是哪个按钮,可以用按钮的
android:id
来区分。在代码中,id
通过Android Studio自动编译生成的R
-资源类来访问,形如R.id.xxx
;而获取一个View
的id
,可以通过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; } }
为了验证按钮响应是否其作用,可以在
onClick()
函数中使用Toast
;在设备上运行之后,就会发现,每点击一次按钮,就会弹出一个小框,提示“onClick”;public void onClick(View view) { ...... Toast.makeText(this, "onClick", Toast.LENGTH_SHORT).show(); }
4.2 表达式输入功能
当用户点击数字键(0-9和.)以及运算符键(+-*/)时,需要将它们对应的符号显示到表达式区域。
- 把
view
转换成Button
类型,通过Button
的getText()
方法,获取按钮上的字符; - 通过Activity的
findViewById()
方法获取表达式区域;在通过表达式区域TextView
的getText()
方法,获取已经显示在表达式区域上的内容; - 把按钮代表的字符,添加到表达式内容的最后;
- 把新的表达式内容,通过
TextView
的setText()
方法,显示到表达式区域上。
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”按钮的时候,清空显示区域的内容和结果区域的内容。
- 通过Activity的
findViewById()
方法,分别获取表达式区域和结果区域; - 通过
TextView
的setText()
方法,分别为它们设置空字符串。
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”按钮的时候,删除表达式内容的最后一个字符。
- 获取表达式区域的内容;
- 如果表达式区域是空的,没有字符串,就不管它;否则利用
String
类的subString()
方法,截取最后一个字符之前的所有内容; - 将最新截取的内容,设置到表达式区域里。
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
库文件可以在安豆网提供的下载地址进行下载。
下载完成后,
- 将下载的
arity-2.1.2.jar
复制到项目工程所在的Calulator\app\libs
目录下,如果这个目录不存在,就自己创建一个; - 在Android Studio左边的项目浏览区,选择
Project
视图; - 在
app->libs->arity-2.1.2,jar
上点击右键,选择Add as Library...
; - 在弹出的选择框中,点击
OK
。
![](https://i-blog.csdnimg.cn/blog_migrate/70850f42cff38ef2c3144f3959a046cb.png)
4.4.2 使用第三方库
利用第三方库,对运算表达式进行计算,
- 获取表达式区域的内容;
- 创建第三方库Arity提供的
Symbols
对象,使用它的evl()
方法,计算表达式的内容; - 将计算结果显示到计算结果区域,并清空表达式区域;
- 如果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编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。
*最后再次感谢各位读者对安豆
的支持,谢谢:)
/*******************************************************************/