Android 计算器解析(二): 加入计算功能
2016-07-10 15:42
447 查看
上一篇博客用的CSDN默认的编辑器,感觉不怎么好用,于是用markdown写了下,结果发现markdown写出来没有CSDN原生的美观,于是又换回CSDN默认的编辑器...
上一篇博客
Android计算器解析(一): 建立简单界面 中,我讲解了如何建立简单界面。
这篇博客将讲解 在计算器中加入计算功能。
使用计算功能需要使用第三方jar包。
下载地址:http://download.csdn.net/detail/like_program/9572139
下载之后将jar包复制到 Project / CalculatorTest / app / libs 文件夹内,在 cn.skw.calculator_1.0.0.jar 上点击右键,选择Add As Library,这样,我们就成功导入了jar包
我们都知道,计算器只能通过按键输入,输入的内容将显示在EditText(输入框)中,而不能直接从EditText(输入框)输入。所以,我们要禁止EditText从键盘输入
在 CalculatorActivity.java 中添加如下代码:
在 CalculatorActivity.java 中添加如下代码:
虽然计算器可以用来计算了,但是看上去太单调了,下一篇博客
Android计算器解析(三): 美化计算器界面 中,我会讲解如何美化界面,让界面看起来更漂亮。
上一篇博客
Android计算器解析(一): 建立简单界面 中,我讲解了如何建立简单界面。
这篇博客将讲解 在计算器中加入计算功能。
使用计算功能需要使用第三方jar包。
下载地址:http://download.csdn.net/detail/like_program/9572139
下载之后将jar包复制到 Project / CalculatorTest / app / libs 文件夹内,在 cn.skw.calculator_1.0.0.jar 上点击右键,选择Add As Library,这样,我们就成功导入了jar包
我们都知道,计算器只能通过按键输入,输入的内容将显示在EditText(输入框)中,而不能直接从EditText(输入框)输入。所以,我们要禁止EditText从键盘输入
在 CalculatorActivity.java 中添加如下代码:
@Override protected void onCreate(Bundle savedInstanceState) { ...... // 禁止EditText从键盘输入 mEditInput.setKeyListener(null); }接下来,我们为操作按钮设置按键监听,并添加按钮逻辑
在 CalculatorActivity.java 中添加如下代码:
public class CalculatorActivity extends AppCompatActivity { ...... /** * 已计算的表达式 */ private String mPreStr = ""; /** * 待计算的表达式 */ private String mLastStr = ""; /** * 计算结果 */ private Object mResult = null; /** * 判断刚刚是否成功执行完一个表达式 * 因为,刚加一个表达式时,需要在原来的表达式后面加上换行标签 */ private boolean mIsExecuteNow = false; /** * 换行符 */ private final String newLine = "<br>"; @Override protected void onCreate(Bundle savedInstanceState) { ...... // 为操作按钮设置按键监听 mGridView.setOnItemClickListener(new OnButtonItemClickListener()); } ...... /** * 这个函数用于设置EditText的显示内容,主要是为了加上html标签. * 所有的显示EditText内容都需要调用此函数 */ private void setText() { final String[] tags = new String[]{ "<font color='#858585'>", "<font color='#CD2626'>", "</font> " }; StringBuilder builder = new StringBuilder(); // 添加颜色标签 builder.append(tags[0]).append(mPreStr).append(tags[2]); builder.append(tags[1]).append(mLastStr).append(tags[2]); // 显示内容 mEditInput.setText(Html.fromHtml(builder.toString())); // 设置光标在EditText的最后位置 mEditInput.setSelection(mEditInput.getText().length()); } /** * 执行 待计算表达式,当用户按下 = 号时,调用这个方法 */ private void executeExpression() { try { // 调用第三方jar包来执行运算 mResult = Calculator.execute(mLastStr); } catch (Exception e) { /** * 如果捕获到异常,表示表达式执行失败, * 这里设置为false是因为并没有执行成功,还不能新的表达式求值 */ mIsExecuteNow = false; return; } /** * 若计算结果成功,把 "=" 和 结果 加到待计算表达式, * 更新视图, * 设置标识为true */ mLastStr += "="+ mResult; setText(); mIsExecuteNow = true; } private class OnButtonItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String text = (String) parent.getAdapter().getItem(position); if (text.equals("=")) { // 执行运算 executeExpression(); } else if (text.equals("Back")) { /** * 如果按下退格键,表示删除一个字符 * 如果待计算表达式长度为0,则需要把已计算表达式的最后 * 部分赋值给待计算表达式 * * 例如: * * 已计算表达式:1+1=2 * 待计算表达式:空 * * 按下Back键后: * * 已计算表达式:空 * 待计算表达式:1+1=2 * */ if (mLastStr.length() == 0) { /** * 如果已计算表达式的长度不是0,那么此时 * 已计算表达式必然以换行符结尾 */ if (mPreStr.length() != 0) { // 清除已计算表达式末尾的换行符 mPreStr = mPreStr.substring(0, mPreStr.length() - newLine.length()); // 找到前一个换行符的位置 int index = mPreStr.lastIndexOf(newLine); if (index == -1) { /** * -1表示没有找到,即 已计算表达式只有一个 * 此时把 仅有的一个已计算表达式赋值给待计算表达式 * * 例如: * * 已计算表达式:1+1=2 * 待计算表达式:空 * * 按下Back键后: * * 已计算表达式:空 * 待计算表达式:1+1=2 */ mLastStr = mPreStr; // 已计算表达式赋值为空 mPreStr = ""; } else { /** * 如果找到前一个换行符,即 已计算表达式数量 > 1 * 此时把已计算表达式的最后一个表达式赋值给 待计算表达式 * * 例如: * * 已计算表达式:1+1=2 * 2+2=4 * 待计算表达式:空 * * 按下Back键后: * * 已计算表达式:1+1=2 * 待计算表达式:2+2=4 */ mLastStr = mPreStr.substring(index + newLine.length(), mPreStr.length()); mPreStr = mPreStr.substring(0, index + newLine.length()); } mIsExecuteNow = true; } } else { // 如果待计算表达式长度不是0,则直接减掉一个字符 mLastStr = mLastStr.substring(0, mLastStr.length() - 1); } // 更新视图 setText(); } else if (text.equals("CE")) { /** * 如果按下 清除键,就把 * 待计算表达式 和 已计算表达式 全部清空, * 显示内容全部清空, * 并设置标识符为false * * 这里需要注意下, * 待计算表达式 和 已计算表达式 全部清空, * 并不代表显示内容就清空了。同样, * 显示内容清空,也不代表 待计算表达式 和 已计算表达式 全部清空。 */ mPreStr = ""; mLastStr = ""; mIsExecuteNow = false; mEditInput.setText(""); } else { // 按下其他键的情况 if (mIsExecuteNow) { /** * 如果刚刚成功执行了一个表达式, * 那么需要把 待计算表达式 加到 已计算表达式 后面并添加换行符 * * 例如: * 已计算表达式:空 * 待计算表达式:1+1=2 * * 按下 1 键后: * * 已计算表达式:1+1=2 * 待计算表达式:1 * */ mPreStr += mLastStr + newLine; // 重置标识为false mIsExecuteNow = false; // 设置待计算表达式的第一个字符为当前按钮按下的内容 mLastStr = text; } else { // 否则直接在待计算表达式后面添加内容就好了 mLastStr += text; } // 更新视图 setText(); } } } } </span>注释已经写的非常详细了,相信大家都能看得懂。好了,运行一下程序,果然,计算器已经可以计算一些简单的表达式了。
虽然计算器可以用来计算了,但是看上去太单调了,下一篇博客
Android计算器解析(三): 美化计算器界面 中,我会讲解如何美化界面,让界面看起来更漂亮。
相关文章推荐
- RecyclerView实现Item点击事件方法一
- Activity的生命周期详解(二)
- 深入探究Android中的Service的运行机制
- Android Studio常见问题解决
- Android之GJSON解析
- Android横竖屏切换总结
- android内存优化之三内存分析工具的使用
- Qt_Android_书
- Android PagerTabStrip和PagerTitleStrip的不同点
- Android开发中下拉刷新如何实现
- Android Support兼容包详解
- Android中Context详解 ---- 你所不知道的Context
- 学习Android开发之RecyclerView使用初探
- AndroidStudio插件
- Android Xfermode 实战 实现圆形、圆角图片(1)
- Android中AIDL实现进程通信(附源码下载)
- Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法
- LinearLayout(线性布局)
- 关于android studio安装使用问题
- Android从零开始之一步一步教你实现联系人功能(一)