论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
移动端开发
›
Android简朴控件实现简易计算器
Android简朴控件实现简易计算器
小秦哥
论坛元老
|
2024-12-22 01:16:03
|
显示全部楼层
|
阅读模式
楼主
主题
1616
|
帖子
1616
|
积分
4848
学了一些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 = ""; // 记录显示文本
@Override
protected 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);
}
@Override
public 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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
小秦哥
论坛元老
这个人很懒什么都没写!
楼主热帖
Python教程(5)——Python的第一个程序 ...
Kubernetes(k8s)安装以及搭建k8s-Das ...
〖Python接口自动化测试实战篇⑤〗- 接 ...
java递归简介说明
网易云信实时视频直播在TCP数据传输层 ...
liunx速记
海量监控数据处理如何做,看华为云SRE ...
从 Stream 到 Kotlin 再到 SPL
开发一个二方包,优雅地为系统接入ELK ...
【问题】为什么 System.Timers.Timer ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
公有云
物联网
网络安全
Oracle
鸿蒙
数据仓库与分析
快速回复
返回顶部
返回列表