Android笔记(十六) 简易计算器
实现功能:
简单计算器
布局及美化
采用LinearLayout嵌套LinearLayout实现布局。
要求
1. 按钮所有文字居于右下角
2. 按钮为白色,点击变成橘色
3. 显示屏文字居右显示并且为橘色
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"> <!-- 显示屏组件 -->
<EditText
android:id="@+id/et_input"
android:layout_width="330dp"
android:layout_height="wrap_content"
android:editable="false"
android:gravity="right"
android:textColor="#ffbf16"/> <!-- 一个垂直线性布局,用来放置所有按钮 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="vertical"> <!-- 一个水平线性布局,用来放置C DEL ÷ × -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal"> <Button
android:id="@+id/btn_clear"
android:layout_width="75dp"
android:layout_height="75dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="C "
android:textSize="25sp" /> <Button
android:id="@+id/btn_del"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="DEL "
android:textSize="25sp" /> <Button
android:id="@+id/btn_divide"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="÷ "
android:textSize="25sp" /> <Button
android:id="@+id/btn_multiply"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="× "
android:textSize="25sp" /> </LinearLayout> <!-- 一个水平线性布局,用来放置7 8 9 - -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="horizontal"> <Button
android:id="@+id/btn_7"
android:layout_width="75dp"
android:layout_height="75dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="7 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_8"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="8 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_9"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="9 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_minus"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="- "
android:textSize="25sp" />
</LinearLayout> <!-- 一个水平线性布局,用来放置4 5 6 7 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="horizontal"> <Button
android:id="@+id/btn_4"
android:layout_width="75dp"
android:layout_height="match_parent"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="4 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_5"
android:layout_width="75dp"
android:layout_height="75dp" android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="5 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_6"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="6 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_sum"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="+ "
android:textSize="25sp" />
</LinearLayout> <!-- 一个水平布局,用来放置剩余按钮 -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"> <!-- 一个垂直布局,用来放置1 2 3 0 . 按钮 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <!-- 一个水平布局,用来放置1 2 3 按钮 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal"> <Button
android:id="@+id/btn_1"
android:layout_width="75dp"
android:layout_height="75dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="1 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_2"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="2 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_3"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="3 "
android:textSize="25sp" />
</LinearLayout> <!-- 一个水平布局,用来放置0 . 按钮 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="horizontal"> <Button
android:id="@+id/btn_0"
android:layout_width="160dp"
android:layout_height="75dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="0 "
android:textSize="25sp" /> <Button
android:id="@+id/btn_point"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginLeft="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text=". "
android:textSize="25sp" />
</LinearLayout>
</LinearLayout> <Button
android:id="@+id/btn_equal"
android:layout_width="75dp"
android:layout_height="160dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:background="@drawable/white_btn_selector"
android:gravity="right|bottom"
android:text="= "
android:textSize="25sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
white_btn_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_selected="true" android:drawable="@drawable/orange"/>
<item android:state_focused="true" android:drawable="@drawable/orange" />
<item android:state_pressed="true" android:drawable="@drawable/orange" />
<item android:drawable="@drawable/white"/>
</selector>
orange.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffbf20"/>
</shape>
white.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff"/>
<corners android:radius="2.0dp" />
</shape>
运行结果:

逻辑实现
MainActivity.java
package cn.lixyz.counterdemo; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity implements View.OnClickListener { Button btn_0; //0数字按钮
Button btn_1; //1数字按钮
Button btn_2; //2数字按钮
Button btn_3; //3数字按钮
Button btn_4; //4数字按钮
Button btn_5; //5数字按钮
Button btn_6; //6数字按钮
Button btn_7; //7数字按钮
Button btn_8; //8数字按钮
Button btn_9; //9数字按钮
Button btn_point; //小数点按钮
Button btn_clear; //clear数字按钮
Button btn_del; //delete数字按钮
Button btn_sum; //加按钮
Button btn_minus; //减按钮
Button btn_multiply; //乘按钮
Button btn_divide; //除按钮
Button btn_equal; //等于按钮 String[] arr = new String[]{"+", "-", "×", "÷"}; EditText et_input;//显示屏 boolean clear_flag = true;//清空标识 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化按钮
btn_0 = (Button) findViewById(R.id.btn_0);
btn_1 = (Button) findViewById(R.id.btn_1);
btn_2 = (Button) findViewById(R.id.btn_2);
btn_3 = (Button) findViewById(R.id.btn_3);
btn_4 = (Button) findViewById(R.id.btn_4);
btn_5 = (Button) findViewById(R.id.btn_5);
btn_6 = (Button) findViewById(R.id.btn_6);
btn_7 = (Button) findViewById(R.id.btn_7);
btn_8 = (Button) findViewById(R.id.btn_8);
btn_9 = (Button) findViewById(R.id.btn_9);
btn_multiply = (Button) findViewById(R.id.btn_multiply);
btn_point = (Button) findViewById(R.id.btn_point);
btn_clear = (Button) findViewById(R.id.btn_clear);
btn_del = (Button) findViewById(R.id.btn_del);
btn_sum = (Button) findViewById(R.id.btn_sum);
btn_minus = (Button) findViewById(R.id.btn_minus);
btn_divide = (Button) findViewById(R.id.btn_divide);
btn_equal = (Button) findViewById(R.id.btn_equal); //实例化显示屏
et_input = (EditText) findViewById(R.id.et_input); //设置这些按钮的点击事件
btn_0.setOnClickListener(this);
btn_1.setOnClickListener(this);
btn_2.setOnClickListener(this);
btn_3.setOnClickListener(this);
btn_4.setOnClickListener(this);
btn_5.setOnClickListener(this);
btn_6.setOnClickListener(this);
btn_7.setOnClickListener(this);
btn_8.setOnClickListener(this);
btn_9.setOnClickListener(this);
btn_multiply.setOnClickListener(this);
btn_point.setOnClickListener(this);
btn_clear.setOnClickListener(this);
btn_del.setOnClickListener(this);
btn_sum.setOnClickListener(this);
btn_minus.setOnClickListener(this);
btn_divide.setOnClickListener(this);
btn_equal.setOnClickListener(this); } @Override
public void onClick(View v) {
//获取目前显示屏上显示的数字,因为为了美观,在布局时,Text属性添加了空格,所以在获取到按钮内容之后,需要去掉空格
String str = et_input.getText().toString(); switch (v.getId()) {
//如果点击的是0~9或者小数点,直接累加到屏幕上
case R.id.btn_0:
case R.id.btn_1:
case R.id.btn_2:
case R.id.btn_3:
case R.id.btn_4:
case R.id.btn_5:
case R.id.btn_6:
case R.id.btn_7:
case R.id.btn_8:
case R.id.btn_9:
case R.id.btn_point:
case R.id.btn_sum:
case R.id.btn_minus:
case R.id.btn_divide:
case R.id.btn_multiply:
//因为传入的是一个View对象,所以需要强制转换为Button对象,才能使用getText()方法
if (clear_flag) {
et_input.setText(str + ((Button) v).getText());
} else {
et_input.setText(((Button) v).getText());
clear_flag = true;
}
Log.d("TEST", ((Button) v).getText().toString() + " " + clear_flag + "");
break;
//如果点击的是C,则将显示屏设置为空
case R.id.btn_clear:
et_input.setText("");
break;
//如果点击的是DEL,如果显示屏不为空,则将显示屏的内容最后一个字符去掉
case R.id.btn_del:
if (str != null && !str.equals("")) {
et_input.setText(et_input.getText().toString().substring(0, str.length() - 1));
}
break;
//如果点击的是等号,则进行运算,判断显示屏上的内容是否存在运算,如果不存在,直接显示当前文字,如果存在运算,进行运算,显示结果
case R.id.btn_equal:
for (int i = 0; i <= arr.length-1; i++) {
if (et_input.getText().toString().contains(arr[i])) {
getResult(et_input.getText().toString());
break;
}
}
// et_input.setText(str);
clear_flag = false;
break;
}
} //运算方法
public void getResult(String string) {
Log.d("TEST", string);
String[] arr2;
Double d1;
Double d2;
if (string.contains("+")) {
arr2 = string.split("\\+");
if (arr2[0].trim().length() == 0) {
d1 = 0.0;
} else {
d1 = Double.parseDouble(arr2[0].replace(" ", ""));
} if (arr2[1].trim().length() == 0) {
d2 = d1;
} else {
d2 = Double.parseDouble(arr2[1].replace(" ", ""));
}
et_input.setText((d1 + d2) + ""); } else if (string.contains("-")) { arr2 = string.split("\\-");
if (arr2[0].trim().length() == 0) {
d1 = 0.0;
} else {
d1 = Double.parseDouble(arr2[0].replace(" ", ""));
} if (arr2[1].trim().length() == 0) {
d2 = d1;
} else {
d2 = Double.parseDouble(arr2[1].replace(" ", ""));
}
et_input.setText((d1 - d2) + ""); } else if (string.contains("×")) {
arr2 = string.split("\\×");
if (arr2[0].trim().length() == 0) {
d1 = 0.0;
} else {
d1 = Double.parseDouble(arr2[0].replace(" ", ""));
} if (arr2[1].trim().length() == 0) {
d2 = d1;
} else {
d2 = Double.parseDouble(arr2[1].replace(" ", ""));
}
et_input.setText((d1 * d2) + "");
} else if (string.contains("÷")) {
arr2 = string.split("\\÷");
if (arr2[0].trim().length() == 0) {
d1 = 0.0;
} else {
d1 = Double.parseDouble(arr2[0].replace(" ", ""));
} if (arr2[1].trim().length() == 0) {
d2 = d1;
} else {
d2 = Double.parseDouble(arr2[1].replace(" ", ""));
}
if (d2 == 0) {
et_input.setText("除数不能为0");
} else {
et_input.setText((d1 / d2) + "");
}
}
}
}
Android笔记(十六) 简易计算器的更多相关文章
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- Android笔记(六十)Android总结:四大组件——BroadcastReceiver篇
什么是BroadcastReceiver BroadcastReceiver是Android体系的四大组件之一,本质上是一种全局的监听器,用于监听系统全局的广播消息,正式因为其本质为全局监听,因此可以 ...
- Unity 游戏框架搭建 2019 (四十六) 简易消息机制 & 集成到 MonoBehaviourSimplify 里
在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题. 脚本之间访问其实有更好的方式. 我们先分下脚本访问脚本的几种形式. 第一种,A GameObject 是 B GameObject 的 ...
- Android入门(十六)调用摄像头相册
原文链接:http://www.orlion.ga/665/ 一.调用摄像头 创建一个项目ChoosePicDemo,修改activity_main.xml: <LinearLayout xml ...
- Android进阶(十六)子线程调用Toast报Can't create handler inside thread that has not called Looper.prepare() 错误
原子线程调用Toast报Can't create handler inside thread that has not called Looper.prepare() 错误 今天用子线程调Toast报 ...
- SpringBoot笔记十六:ElasticSearch
目录 ElasticSearch官方文档 ElasticSearch安装 ElasticSearch简介 ElasticSearch操作数据,RESTful风格 存储 检查是否存在 删除 查询 更新 ...
- Android笔记(六):线程及线程通信
线程 由于Android的Activity中默认所有代码都在主线程(UI线程)中执行,如果在这里面执行耗时任务(例如下载),界面就会无反应且不可操作,直到耗时任务执行完毕. 如果想在执行耗时任务的同时 ...
- Android笔记(六十一)动态添加组件
想要一个功能,点击按钮,可以在已有的布局上,新添加一组组件. 动态的创建组件,本质上还是创建组件,只不过是在程序中根据逻辑来创建.大致步骤是找到要创建控件的位置,然后将要创建的组件添加进去. 看代码: ...
- Android笔记(六) Android中的组件
一个软件可以吸引到用户,除了优秀的功能可以解决用户的问题之外,良好的用户界面也并不可少.一个软件的功能不管多么优秀,但是没有提供友好的界面来让用户操作,将很难吸引到最终用户. Android提供了大量 ...
随机推荐
- 宣化上人:大佛顶首楞严经四种清净明诲浅释(4-5)(转自学佛网:http://www.xuefo.net/nr/article23/230699.html)
大佛顶首楞严经四种清净明诲浅释(4) 唐天竺·沙门般剌密帝译 宣化上人主讲 一九八三年四月十七日晚讲于万佛圣城 汝教世人修三摩地.先断心淫.是名如来.先佛世尊.第一决定清净明诲. 所以说,教人这个爱的 ...
- Windows自动计划任务与ParamStr详解
ParamStr函数: ParamStr(1),..ParamStr(N) ParamStr(1)代表程序入口的第一个参数,同理,ParamStr(N)代表第N个参数.可通过如下操作进行参数的赋值. ...
- AI佳作解读系列(五) - 目标检测二十年技术综述
计算机视觉中的目标检测,因其在真实世界的大量应用需求,比如自动驾驶.视频监控.机器人视觉等,而被研究学者广泛关注. 上周四,arXiv新出一篇目标检测文献<Object Detection ...
- HDU3853 LOOPS 期望DP基础题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 题目大意(只是大意,名字什么的可能和原题描述不一样~): 爱丽丝与华容道 题目描述 爱丽丝是一个 ...
- LODOP指定window默认打印机和临时默认打印机
通过以下语句,可指定windows默认打印机LODOP.SET_PRINT_MODE("WINDOW_DEFPRINTER",某打印机名或序号);这种默认打印机是指的windows ...
- 【Leetcode_easy】908. Smallest Range I
problem 908. Smallest Range I solution: class Solution { public: int smallestRangeI(vector<int> ...
- 【ARTS】01_40_左耳听风-201900812~201900818
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- Linux终极shell-zsh的完美配置方案!——oh-my-zsh
Zsh 介绍 Zsh 兼容 Bash,据传说 99% 的 Bash 操作 和 Zsh 是相同的 Zsh 官网:http://www.zsh.org/ 先看下你的 Linux支持哪些 shell:cat ...
- idm技术下载百度网盘
原使用教程:https://www.haorenka.org/idm.html 使用idm下载器后实际下载速度,比原网盘客户端快很多 相关软件下载 参考上面的参考教程,这里只提供对应所需要的文件,有的 ...
- C# 基于Directshow.Net lib库 USB摄像头使用DirectShow.NET获取摄像头视频流
https://blog.csdn.net/u010118312/article/details/91766787 https://download.csdn.net/download/u010118 ...