Android 计算器解析(二): 加入计算功能

版权声明:本文为 like_program 原创文章,未经博主允许不得转载。 https://blog.csdn.net/like_program/article/details/51871797
上一篇博客用的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计算器解析(三): 美化计算器界面 中,我会讲解如何美化界面,让界面看起来更漂亮

猜你喜欢

转载自blog.csdn.net/like_program/article/details/51871797