学了一些Android的简单控件,用这些布局和控件,设计并实现一个简单计算器。
计算器的界面分为两大部分,第一部分是上方的计算表达式,既包括用户的按键输入,也包括计算结果 数字;第二部分是下方的各个按键,例如:从0到9的数字按钮、加减乘除与等号、正负号按钮、小数点 按钮、求倒数按钮、平方按钮、开方按钮,以及退格、清空、取消等控制按钮。通过这些按键操作,能 够实现整数和小数的四则运算,以及求倒数、求平方、求开方等简单运算
按照计算器App的效果图,大致分布着下列Android控件:
- 线性布局LinearLayout:因为计算器界面整体从上往下布局,所以需要垂直方向的LinearLayout。
- 网格布局GridLayout:计算器下半部分的几排按钮,正好成五行四列表格分布,适合采用 GridLayout。
- 滚动视图ScrollView:虽然计算器界面不宽也不高,但是以防万一,最好还是加个垂直方向的 ScrollView。
- 文本视图TextView:很明显顶部标题“简单计算器”就是TextView,且文字居中显示;标题下面的计 算结果也需要使用TextView,且文字靠右靠下显示。
- 按钮Button:几乎所有的数字与运算符按钮都采用了Button控件。
- 图像按钮ImageButton:开根号的运算符“√”虽然能够打出来,但是右上角少了数学课本上的一横, 所以该按钮要显示一张标准的开根号图片,这用到了ImageButton。
CalculatorActivity.java
package com.example.chapter03;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener {private TextView tv_result;private String firstNum = ""; // 记录第一个操作数private String secondNum = ""; // 记录第二个操作数private String operator = ""; // 记录运算符private String result = ""; // 记录运算结果private String showText = ""; // 记录显示文本@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_calculator);tv_result = findViewById(R.id.tv_result);// 给每个按钮控件注册点击监听器findViewById(R.id.btn_clear).setOnClickListener(this);findViewById(R.id.btn_cancel).setOnClickListener(this);findViewById(R.id.btn_plus).setOnClickListener(this);findViewById(R.id.btn_minus).setOnClickListener(this);findViewById(R.id.btn_multiply).setOnClickListener(this);findViewById(R.id.btn_reciprocal).setOnClickListener(this);findViewById(R.id.btn_equal).setOnClickListener(this);findViewById(R.id.ib_sqrt).setOnClickListener(this);findViewById(R.id.btn_divide).setOnClickListener(this);findViewById(R.id.btn_zero).setOnClickListener(this);findViewById(R.id.btn_one).setOnClickListener(this);findViewById(R.id.btn_two).setOnClickListener(this);findViewById(R.id.btn_three).setOnClickListener(this);findViewById(R.id.btn_four).setOnClickListener(this);findViewById(R.id.btn_five).setOnClickListener(this);findViewById(R.id.btn_six).setOnClickListener(this);findViewById(R.id.btn_seven).setOnClickListener(this);findViewById(R.id.btn_eight).setOnClickListener(this);findViewById(R.id.btn_nine).setOnClickListener(this);findViewById(R.id.btn_dot).setOnClickListener(this);}@Overridepublic void onClick(View v) {String inputText;if (v.getId() == R.id.ib_sqrt) {inputText = "√";} else {inputText = ((TextView) v).getText().toString();}switch (v.getId()) {// 清除case R.id.btn_clear:clear();break;case R.id.btn_cancel:if (!showText.equals("")) {showText = showText.substring(0, showText.length() - 1);if (operator.equals("")) {firstNum = showText;} else {secondNum = showText;}refreshResult(showText);}break;case R.id.btn_plus:case R.id.btn_minus:case R.id.btn_multiply:case R.id.btn_divide:if (firstNum.equals("")) {firstNum = "0";}operator = inputText;refreshResult(showText + inputText);break;case R.id.btn_equal:double calculate_result = calculateFour();if (calculate_result == 0) {result = showText;} else {refreshOperate(String.valueOf(calculate_result));refreshResult(showText + "=" + result);}break;case R.id.ib_sqrt:if (operator.equals("")) {double sqrt_result = Math.sqrt(Double.parseDouble(firstNum));refreshOperate(String.valueOf(sqrt_result));refreshResult("√" + firstNum + "=" + result);} else {double sqrt_result = Math.sqrt(Double.parseDouble(secondNum));secondNum = String.valueOf(sqrt_result);refreshResult(firstNum + operator + secondNum);}break;case R.id.btn_reciprocal:double reciprocal_result = 1 / Double.parseDouble(firstNum);refreshOperate(String.valueOf(reciprocal_result));refreshResult("1/" + showText + "=" + result);break;default:// 数字键if ((result.contains("Error")) || (!result.equals("") && operator.equals(""))) {clear();}if (operator.equals("")) {firstNum += inputText;} else {secondNum += inputText;}if (showText.equals("0") && !inputText.equals(".")) {refreshResult(inputText);} else {refreshResult(showText + inputText);}break;}}private double calculateFour() {if (secondNum.equals("")) {secondNum = "0";}switch (operator) {case "+":return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);case "-":return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);case "x":return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);case "÷":if (Double.parseDouble(secondNum) == 0) {clear();tv_result.setText("Error: 除数不能为0");return 0;}return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);}return 0;}// 清除private void clear() {refreshOperate("");refreshResult("");firstNum = "";secondNum = "";operator = "";result = "";showText = "";}// 刷新运算结果private void refreshOperate(String new_result) {result = new_result;firstNum = result;secondNum = "";operator = "";}// 刷新文本显示private void refreshResult(String text) {showText = text;tv_result.setText(showText);}
}
代码:Calculator.java,res/layout/activity_calculator.xml