您的位置:首页 > 移动开发 > Android开发

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 中添加如下代码:

@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计算器解析(三): 美化计算器界面 中,我会讲解如何美化界面,让界面看起来更漂亮。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: