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提供了大量 ...
随机推荐
- 宣化上人:大佛顶首楞严经四种清净明诲浅释(10-11) -------------------------------------------------------------------------------- (转自学佛网:http://www.xuefo.net/nr/article23/230920.html)
大佛顶首楞严经四种清净明诲浅释(10) 唐天竺·沙门般剌密帝译 宣化上人主讲 一九八三年四月十七日晚讲于万佛圣城 是故阿难.若不断偷修禅定者.譬如有人.水灌漏卮.欲求其满.纵经尘劫.终无平复. 是故阿 ...
- echars 3.0 去掉柱状图阴影用什么属性
原图展示: 效果图展示: 在代码中注释掉这段 // tooltip : { // trigger: 'axis', // axisPointer : { // 坐标轴指示器,坐标轴触发有效 // ty ...
- UML学习笔记:类图
UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...
- 代码内存泄露检测(1) MLeaksFinder (Wechat开源) + FBRetainCycleDetector (FaceBook开源)
每次项目编译完成之后,都被内存搞得头昏脑胀,压力甚大. 利用两周时间,稍微研究了 微信开源的 MLeaksFinder 和 facebook 开源的 FBMemoryProfiler, 这两个开源三方 ...
- nnexus3 破解密码
主要步骤如下: 1.停服 2.进入OrientDB控制台:java -jar /usr/local/nexus/lib/support/nexus-orient-console.jar 3.在控制台执 ...
- [NPM错误]npm ERR! Unexpected end of JSON input while parsing near ‘’
[错误描述] npm ERR! Unexpected end of JSON input while parsing near ‘ ’ [前提描述] 在安装vue2-editor时,中断暂停了,再次 ...
- oracle安装内核参数设置
安装oracle内核参数说明及设置 kernel.shmmax 说明: Linux进程可以分配的单独共享内存段的最大值(byte) 64位的linux操作系统,设置应该大于SGA_MAX_TARGET ...
- WUSTOJ 1346: DARK SOULS(Java)并查集
题目链接:1346: DARK SOULS 并查集系列:WUSTOJ 1319: 球(Java)并查集 Description CQ最近在玩一款游戏:DARK SOULS,这是一款以高难度闻名的硬派动 ...
- Scala 算法案例
移除第一个负数之后的所有负数 // 构建数组 val a = ArrayBuffer[Int]() a += (1, 2, 3, 4, 5, -1, -3, -5, -9) // 每发现一个第一个负数 ...
- 基于thymeleaf实现简单登录
1.引入thymeleaf.静态资源等依赖 <dependency> <groupId>org.springframework.boot</groupId> < ...