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提供了大量 ...
随机推荐
- hadoop记录-[Flink]Flink三种运行模式安装部署以及实现WordCount(转载)
[Flink]Flink三种运行模式安装部署以及实现WordCount 前言 Flink三种运行方式:Local.Standalone.On Yarn.成功部署后分别用Scala和Java实现word ...
- 关于PF_INET和AF_INET的区别
在写网络程序的时候,建立TCP socket: sock = socket(PF_INET, SOCK_STREAM, 0);然后在绑定本地地址或连接远程地址时需要初始化sockaddr_in结构 ...
- Red Team远程控制软件
开源远程管理控制 https://github.com/malwaredllc/byob 僵尸网络生成框架 https://github.com/panda-re/lava 大规模向程序中植入恶意程序 ...
- git和GitHub初级
使用方式: 一种是本地创建一个文档, 然后在github上创建一个仓库, 在上传上去 一种是从仓库下载代码, 然后在本地编辑, 然后在上传上去 第一种: 首先在linux上创建一个文档, mkdir ...
- Mstar方案软件运行基本原理
1. MApp_Main.c里有个while(1)循环: 2. 通过 while(1)循环MApp_MultiTasks 里面的 MApp_ProcessUserInput 可以 得到 当前的 u8K ...
- 使用gomod后,导入模块与编译要注意的事项
问题:在使用go mod后,执行编译会报错: Cannot load xxx: cannot find module providing package xxx 目录结构如下: J:. │ └─src ...
- Python 装饰器执行顺序
Python 装饰器执行顺序 之前同事问到两个装饰器在代码中使用顺序不同会不会有什么问题,装饰器是对被装饰的函数做了一层包装,然后执行的时候执行了被包装后的函数,例如: def decorator_a ...
- SSM-CRUD
一.项目介绍 前端技术:query+Bootstrap+ajax+json 后端技术:SSM(spring.springMVC.mybatis).JSR303校验 数据库:mysql 服务器:tomc ...
- c++ 编译 curl 报错 数组‘__curl_rule_01__’的大小为负 解决方法
背景:在原有的项目GCC编译环境下(arm-linux 32位),增加x86-linux 64位的编译环境,编译curl库的时候发生错误. 其他:编译服务器为64位Centos 编译错误提示 /inc ...
- 07 UML类图
移步: https://www.cnblogs.com/coolstream/p/9572846.html