Android简朴控件实现简易计算器

打印 上一主题 下一主题

主题 1616|帖子 1616|积分 4848

学了一些Android的简朴控件,用这些布局和控件,计划并实现一个简朴计算器。
计算器的界面分为两大部分,第一部分是上方的计算表达式,既包括用户的按键输入,也包括计算结果 数字;第二部分是下方的各个按键,例如:从0到9的数字按钮、加减乘除与等号、正负号按钮、小数点 按钮、求倒数按钮、平方按钮、开方按钮,以及退格、清空、取消等控制按钮。通过这些按键操纵,能 够实现整数和小数的四则运算,以及求倒数、求平方、求开方等简朴运算
按照计算器App的效果图,大致分布着下列Android控件:


  • 线性布局LinearLayout:由于计算器界面团体从上往下布局,所以需要垂直方向的LinearLayout。
  • 网格布局GridLayout:计算器下半部分的几排按钮,正好成五行四列表格分布,适合采用 GridLayout。
  • 滚动视图ScrollView:固然计算器界面不宽也不高,但是以防万一,最好照旧加个垂直方向的 ScrollView。
  • 文本视图TextView:很显着顶部标题“简朴计算器”就是TextView,且文字居中表现;标题下面的计 算结果也需要使用TextView,且文字靠右靠下表现。
  • 按钮Button:几乎所有的数字与运算符按钮都采用了Button控件。
  • 图像按钮ImageButton:开根号的运算符“√”固然能够打出来,但是右上角少了数学课本上的一横, 所以该按钮要表现一张标准的开根号图片,这用到了ImageButton。

CalculatorActivity.java
  1. package com.example.chapter03;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.TextView;
  6. public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener {
  7.     private TextView tv_result;
  8.     private String firstNum = ""; // 记录第一个操作数
  9.     private String secondNum = ""; // 记录第二个操作数
  10.     private String operator = ""; // 记录运算符
  11.     private String result = ""; // 记录运算结果
  12.     private String showText = ""; // 记录显示文本
  13.     @Override
  14.     protected void onCreate(Bundle savedInstanceState) {
  15.         super.onCreate(savedInstanceState);
  16.         setContentView(R.layout.activity_calculator);
  17.         tv_result = findViewById(R.id.tv_result);
  18.         // 给每个按钮控件注册点击监听器
  19.         findViewById(R.id.btn_clear).setOnClickListener(this);
  20.         findViewById(R.id.btn_cancel).setOnClickListener(this);
  21.         findViewById(R.id.btn_plus).setOnClickListener(this);
  22.         findViewById(R.id.btn_minus).setOnClickListener(this);
  23.         findViewById(R.id.btn_multiply).setOnClickListener(this);
  24.         findViewById(R.id.btn_reciprocal).setOnClickListener(this);
  25.         findViewById(R.id.btn_equal).setOnClickListener(this);
  26.         findViewById(R.id.ib_sqrt).setOnClickListener(this);
  27.         findViewById(R.id.btn_divide).setOnClickListener(this);
  28.         findViewById(R.id.btn_zero).setOnClickListener(this);
  29.         findViewById(R.id.btn_one).setOnClickListener(this);
  30.         findViewById(R.id.btn_two).setOnClickListener(this);
  31.         findViewById(R.id.btn_three).setOnClickListener(this);
  32.         findViewById(R.id.btn_four).setOnClickListener(this);
  33.         findViewById(R.id.btn_five).setOnClickListener(this);
  34.         findViewById(R.id.btn_six).setOnClickListener(this);
  35.         findViewById(R.id.btn_seven).setOnClickListener(this);
  36.         findViewById(R.id.btn_eight).setOnClickListener(this);
  37.         findViewById(R.id.btn_nine).setOnClickListener(this);
  38.         findViewById(R.id.btn_dot).setOnClickListener(this);
  39.     }
  40.     @Override
  41.     public void onClick(View v) {
  42.         String inputText;
  43.         if (v.getId() == R.id.ib_sqrt) {
  44.             inputText = "√";
  45.         } else {
  46.             inputText = ((TextView) v).getText().toString();
  47.         }
  48.         switch (v.getId()) {
  49.             // 清除
  50.             case R.id.btn_clear:
  51.                 clear();
  52.                 break;
  53.             case R.id.btn_cancel:
  54.                 if (!showText.equals("")) {
  55.                     showText = showText.substring(0, showText.length() - 1);
  56.                     if (operator.equals("")) {
  57.                         firstNum = showText;
  58.                     } else {
  59.                         secondNum = showText;
  60.                     }
  61.                     refreshResult(showText);
  62.                 }
  63.                 break;
  64.             case R.id.btn_plus:
  65.             case R.id.btn_minus:
  66.             case R.id.btn_multiply:
  67.             case R.id.btn_divide:
  68.                 if (firstNum.equals("")) {
  69.                     firstNum = "0";
  70.                 }
  71.                 operator = inputText;
  72.                 refreshResult(showText + inputText);
  73.                 break;
  74.             case R.id.btn_equal:
  75.                 double calculate_result = calculateFour();
  76.                 if (calculate_result == 0) {
  77.                     result = showText;
  78.                 } else {
  79.                     refreshOperate(String.valueOf(calculate_result));
  80.                     refreshResult(showText + "=" + result);
  81.                 }
  82.                 break;
  83.             case R.id.ib_sqrt:
  84.                 if (operator.equals("")) {
  85.                     double sqrt_result = Math.sqrt(Double.parseDouble(firstNum));
  86.                     refreshOperate(String.valueOf(sqrt_result));
  87.                     refreshResult("√" + firstNum + "=" + result);
  88.                 } else {
  89.                     double sqrt_result = Math.sqrt(Double.parseDouble(secondNum));
  90.                     secondNum = String.valueOf(sqrt_result);
  91.                     refreshResult(firstNum + operator + secondNum);
  92.                 }
  93.                 break;
  94.             case R.id.btn_reciprocal:
  95.                 double reciprocal_result = 1 / Double.parseDouble(firstNum);
  96.                 refreshOperate(String.valueOf(reciprocal_result));
  97.                 refreshResult("1/" + showText + "=" + result);
  98.                 break;
  99.             default:
  100.                 // 数字键
  101.                 if ((result.contains("Error")) || (!result.equals("") && operator.equals(""))) {
  102.                     clear();
  103.                 }
  104.                 if (operator.equals("")) {
  105.                     firstNum += inputText;
  106.                 } else {
  107.                     secondNum += inputText;
  108.                 }
  109.                 if (showText.equals("0") && !inputText.equals(".")) {
  110.                     refreshResult(inputText);
  111.                 } else {
  112.                     refreshResult(showText + inputText);
  113.                 }
  114.                 break;
  115.         }
  116.     }
  117.     private double calculateFour() {
  118.         if (secondNum.equals("")) {
  119.             secondNum = "0";
  120.         }
  121.         switch (operator) {
  122.             case "+":
  123.                 return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
  124.             case "-":
  125.                 return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
  126.             case "x":
  127.                 return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
  128.             case "÷":
  129.                 if (Double.parseDouble(secondNum) == 0) {
  130.                     clear();
  131.                     tv_result.setText("Error: 除数不能为0");
  132.                     return 0;
  133.                 }
  134.                 return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
  135.         }
  136.         return 0;
  137.     }
  138.     // 清除
  139.     private void clear() {
  140.         refreshOperate("");
  141.         refreshResult("");
  142.         firstNum = "";
  143.         secondNum = "";
  144.         operator = "";
  145.         result = "";
  146.         showText = "";
  147.     }
  148.     // 刷新运算结果
  149.     private void refreshOperate(String new_result) {
  150.         result = new_result;
  151.         firstNum = result;
  152.         secondNum = "";
  153.         operator = "";
  154.     }
  155.     // 刷新文本显示
  156.     private void refreshResult(String text) {
  157.         showText = text;
  158.         tv_result.setText(showText);
  159.     }
  160. }
复制代码
代码:Calculator.java,res/layout/activity_calculator.xml

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表