计算器是手机上的基础应用之一,为方便用户使用,我们可以开发一款简单的安卓计算器应用。本文将介绍安卓计算器开发的原理和详细步骤。
开发计算器的步骤如下:
1. 创建一个新的安卓项目,为项目定义名称、包名以及其他属性。
2. 创建布局文件 activity_main.xml, 在该文件中使用 RelativeLayout 布局,设置 TextView 显示运算表达式和计算结果,通过布局实现计算器的各个按键。
3. 方法一:通过代码实现计算器按键的逻辑功能。在 MainActivity.java 文件中,为每个按键设置相应的监听器,分别处理不同的按键事件。通过回调函数获取按键信息,实现对应的数学运算,最终显示运算结果。
```java
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView formulaText, resultText;
private boolean isFirst = true; // 是否计算的第一个数
private boolean isError = false; // 是否输入错误
private boolean isCounted = false; // 是否按等号计算
private float num1 = 0.0f; // 第一个数
private float num2 = 0.0f; // 第二个数
private String operator = ""; // 运算符
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控件
formulaText = findViewById(R.id.formulaText);
resultText = findViewById(R.id.resultText);
// 为按键设置监听器
findViewById(R.id.oneBtn).setOnClickListener(this);
findViewById(R.id.twoBtn).setOnClickListener(this);
findViewById(R.id.threeBtn).setOnClickListener(this);
// ...... 其他按键同理
findViewById(R.id.plusBtn).setOnClickListener(this);
findViewById(R.id.minusBtn).setOnClickListener(this);
findViewById(R.id.multiplyBtn).setOnClickListener(this);
findViewById(R.id.divideBtn).setOnClickListener(this);
findViewById(R.id.clearBtn).setOnClickListener(this);
findViewById(R.id.equalBtn).setOnClickListener(this);
findViewById(R.id.dotBtn).setOnClickListener(this);
}
@Override
public void onClick(View v) {
int key = v.getId();
if(isError) { // 如果输入式子有误,直接返回
Toast.makeText(this, "Input Error!", Toast.LENGTH_SHORT).show();
return;
}
switch(key) {
case R.id.oneBtn:
addCharToFormula("1");
break;
case R.id.twoBtn:
addCharToFormula("2");
break;
case R.id.threeBtn:
addCharToFormula("3");
break;
// ...... 其他按键同理
case R.id.plusBtn:
setOperator("+");
break;
case R.id.minusBtn:
setOperator("-");
break;
case R.id.multiplyBtn:
setOperator("*");
break;
case R.id.divideBtn:
setOperator("/");
break;
case R.id.dotBtn:
addDot();
break;
case R.id.clearBtn:
clear();
break;
case R.id.equalBtn:
calculate();
break;
}
}
private void addCharToFormula(String ch) {
if(isCounted) {
clear();
isCounted = false;
}
if(isFirst) {
resultText.setText(ch);
isFirst = false;
} else {
resultText.append(ch);
}
formulaText.append(ch);
}
private void setOperator(String op) {
if(isFirst) {
Toast.makeText(this, "Input error!", Toast.LENGTH_SHORT).show();
isError = true;
return;
}
operator = op;
isFirst = true;
formulaText.append(op);
}
private void addDot() {
if(isFirst) {
isFirst = false;
resultText.setText("0.");
formulaText.append("0.");
} else {
String str = resultText.getText().toString();
if(str.indexOf(".") == -1) {
resultText.append(".");
formulaText.append(".");
}
}
}
private void clear() {
resultText.setText("0");
formulaText.setText("");
isFirst = true;
isError = false;
isCounted = false;
num1 = 0.0f;
num2 = 0.0f;
operator = "";
}
private void calculate() {
if(isFirst) {
Toast.makeText(this, "输入出错", Toast.LENGTH_SHORT).show();
isError = true;
return;
}
num2 = Float.parseFloat(resultText.getText().toString().trim());
float result = 0.0f;
switch(operator) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
if(num2 == 0.0f) {
Toast.makeText(this, "输入出错", Toast.LENGTH_SHORT).show();
isError = true;
return;
}
result = num1 / num2;
break;
}
resultText.setText(String.valueOf(result));
formulaText.append("="+String.valueOf(result));
num1 = result;
num2 = 0.0f;
isCounted = true;
isFirst = true;
}
}
```
4. 方法二:使用表达式计算器库 ExpressionEval,简单实现计算器的功能。在 gradle 文件中引入该库,使用该库计算表达式的值并在 TextView 中显示。
```java
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView formulaText, resultText;
private String currentFormula = ""; // 当前运算表达式
private String currentResult = ""; // 当前运算结果
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
formulaText = findViewById(R.id.formulaText);
resultText = findViewById(R.id.resultText);
// 为按键设置监听器
findViewById(R.id.oneBtn).setOnClickListener(this);
findViewById(R.id.twoBtn).setOnClickListener(this);
findViewById(R.id.threeBtn).setOnClickListener(this);
// ...... 其他按键同理
findViewById(R.id.plusBtn).setOnClickListener(this);
findViewById(R.id.minusBtn).setOnClickListener(this);
findViewById(R.id.multiplyBtn).setOnClickListener(this);
findViewById(R.id.divideBtn).setOnClickListener(this);
findViewById(R.id.clearBtn).setOnClickListener(this);
findViewById(R.id.equalBtn).setOnClickListener(this);
findViewById(R.id.dotBtn).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.oneBtn:
addCharToFormula("1");
break;
case R.id.twoBtn:
addCharToFormula("2");
break;
case R.id.threeBtn:
addCharToFormula("3");
break;
// ...... 其他按键同理
case R.id.plusBtn:
addCharToFormula("+");
break;
case R.id.minusBtn:
addCharToFormula("-");
break;
case R.id.multiplyBtn:
addCharToFormula("*");
break;
case R.id.divideBtn:
addCharToFormula("/");
break;
case R.id.dotBtn:
addCharToFormula(".");
break;
case R.id.clearBtn:
clear();
break;
case R.id.equalBtn:
calculate();
break;
}
}
private void addCharToFormula(String ch) {
String str = formulaText.getText().toString().trim();
formulaText.setText(str+ch);
currentFormula += ch;
calculate();
}
private void clear() {
formulaText.setText("");
resultText.setText("");
currentFormula = "";
currentResult = "";
}
private void calculate() {
try {
currentResult = new Expression(currentFormula).eval().toPlainString();
resultText.setText(currentResult);
} catch (Exception e) {
resultText.setText("");
}
}
}
```
以上两种实现方式,都可以简单实现一款安卓计算器应用,读者可以根据自己的需要选择适合自己的方式实现。