鄙人新手 整了 快两天 终于搞定了。。

1.首先是MainActivity 中 在Oncreate函数中 注册

2.按+ 或者 - 号 来分成两大字符串 s1 和 s2

  再将s2 分为更小的s1 和 s2 直到 s2不包含+ 或者 -号

思路就是这样,没用递归,递归速度太慢,也不擅长用递归。

3.就是找各种Bug 还有装饰

基本达成目标 和自己手机上安卓的自带计算器基本一样。

改正 双击等于 死机

改正 除数可以为0

改正 不能多个运算符

...未知

项目代码如下:

链接: http://pan.baidu.com/s/1c0dj748 密码: hkyx

写法如下package com.example.administrator.myapplication;


import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener {
private Button bt_0;
private Button bt_1;
private Button bt_2;
private Button bt_3;
private Button bt_4;
private Button bt_5;
private Button bt_6;
private Button bt_7;
private Button bt_8;
private Button bt_9;
private Button bt_point; private Button bt_C;
private Button bt_DEL;
private Button bt_minuse;
private Button bt_multipy;
private Button bt_plus;
private Button bt_divide;
private Button bt_dengyu; private EditText input_text; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 注册Button
bt_0 = (Button) findViewById(R.id.bt_0);
bt_1 = (Button) findViewById(R.id.bt_1);
bt_2 = (Button) findViewById(R.id.bt_2);
bt_3 = (Button) findViewById(R.id.bt_3);
bt_4 = (Button) findViewById(R.id.bt_4);
bt_5 = (Button) findViewById(R.id.bt_5);
bt_6 = (Button) findViewById(R.id.bt_6);
bt_7 = (Button) findViewById(R.id.bt_7);
bt_8 = (Button) findViewById(R.id.bt_8);
bt_9 = (Button) findViewById(R.id.bt_9);
bt_point = (Button) findViewById(R.id.bt_point); bt_C = (Button) findViewById(R.id.bt_clear);
bt_DEL = (Button) findViewById(R.id.bt_del);
bt_minuse = (Button) findViewById(R.id.bt_minuse);
bt_multipy = (Button) findViewById(R.id.bt_multipy);
bt_plus = (Button) findViewById(R.id.bt_plus);
bt_divide = (Button) findViewById(R.id.bt_divide);
bt_dengyu = (Button) findViewById(R.id.bt_dengyu); input_text = (EditText) findViewById(R.id.edit_text1); // 监听事件
bt_0.setOnClickListener(this);
bt_1.setOnClickListener(this);
bt_2.setOnClickListener(this);
bt_3.setOnClickListener(this);
bt_4.setOnClickListener(this);
bt_5.setOnClickListener(this);
bt_6.setOnClickListener(this);
bt_7.setOnClickListener(this);
bt_8.setOnClickListener(this);
bt_9.setOnClickListener(this);
bt_point.setOnClickListener(this); bt_C.setOnClickListener(this);
bt_DEL.setOnClickListener(this);
bt_minuse.setOnClickListener(this);
bt_multipy.setOnClickListener(this);
bt_plus.setOnClickListener(this);
bt_divide.setOnClickListener(this);
bt_dengyu.setOnClickListener(this); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
} @Override
public void onClick(View v) {
String str = input_text.getText().toString();
switch (v.getId()) {
case R.id.bt_0:
case R.id.bt_1:
case R.id.bt_2:
case R.id.bt_3:
case R.id.bt_4:
case R.id.bt_5:
case R.id.bt_6:
case R.id.bt_7:
case R.id.bt_8:
case R.id.bt_9:
input_text.setText(str + ((Button) v).getText());
break;
case R.id.bt_point:
if (!str.contains(".")) input_text.setText(str + ((Button) v).getText());
break;
case R.id.bt_plus:
case R.id.bt_minuse:
case R.id.bt_multipy:
case R.id.bt_divide:
if(str.equals(""));
else {
char a =str.charAt(str.length()-1);
Log.i("str",str+"");
Log.i("最后一位字符",a+"");
if( a ==' ' );
else {
input_text.setText(str + " " + ((Button) v).getText() + " ");
}
a =str.charAt(str.length()-1);
break;
}
break; case R.id.bt_clear:
input_text.setText(null);
break;
case R.id.bt_del:
if (str != null && !str.equals("")) {
input_text.setText(str.substring(0, str.length() - 1));
}
break;
case R.id.bt_dengyu:
getRseult();
break; }
} //运算结果
private void getRseult() {
String str = input_text.getText().toString();
if (str == null || str.equals(""))
return;
if(!str.contains("+") &&!str.contains("-")&&!str.contains("×")&&!str.contains("÷") )
return;
//遍历计算result
double result = 0;
char a =str.charAt(str.length()-2);
if(a == '+' || a == '-'){
str = str + '0';
}
else if(a == '×' || a == '÷'){
str = str + '1';
} int i = 0;
int start = 0;
char temp =' '; int flag = 1; if(!str.contains("+") &&!str.contains("-")){
result += calculate_include_multy_or_minuse(str);
}
else {
for (; i < str.length(); i++) {
char c = str.charAt(i); if (c == '+' || c == '-') {
String s1 = str.substring(start, i);
Log.i("S1是", s1 + "");
if(flag == 0) result -= calculate_include_multy_or_minuse(s1);
else result += calculate_include_multy_or_minuse(s1); start = i + 1; if(c == '-') flag = 0;
else flag = 1;
String s2 = str.substring(start, str.length());
Log.i("S2是", s2 + ""); if (s2.contains("+") || s2.contains("-")) {
temp = c;
continue;
}
else {
if(flag == 0) {
result -= calculate_include_multy_or_minuse(s2);
}
else result += calculate_include_multy_or_minuse(s2); }
}
}
}
int r = 0;
String result_string = Double.toString(result);
    if(Double.toString(result) == "Infinity") input_text.setText("傻啊?除数为0");
else if ((int)result == result){
r = (int)result;
input_text.setText(r + "");
}
else
input_text.setText(result + ""); } private double calculate(String s) {
double sum = 1;
int start = 0;
int flag = 0;
int flag2 = 0;
s = s + '×'; char op = ' ';
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '×' || c == '÷') { if (flag2 == 0) op = c;
String s1 = s.substring(start, i);
if (flag == 0) {
sum *= Double.parseDouble(s1);
// Log.i("第一个是"," "+sum);
flag = 1;
flag2 = 1;
} else {
switch (op) {
case '×':
// Log.i("s1是"," "+s1);
sum = sum * Double.parseDouble(s1);
// Log.i("sum是"," "+sum);
break;
case '÷':
// Log.i("s2是"," "+s1);
sum = sum / Double.parseDouble(s1);
// Log.i("sum是"," "+sum);
break;
}
}
op = c;
start = i + 1;
}
}
// Log.i("sum的结果是", " " + sum); return sum;
} private double calculate_include_multy_or_minuse(String s) {
double sum = 0;
if (s.contains("×") || s.contains("÷")) {
sum = calculate(s);
} else {
sum = Double.parseDouble(s);
} return sum;
}
}

  

  

Android 计算器制作 2.注册View 构建函数的更多相关文章

  1. Android 计算器制作 1.布局

    1.activity_main.xml文件布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andr ...

  2. Android模板制作

    本文详细介绍模板相关的知识和如何制作Android模版及使用,便于较少不必要的重复性工作.比如我在工作中如果要创建一个新的模块,就不要需要创建MVP相关的几个类:Model.View.Presente ...

  3. Android中制作自定义dialog对话框的实例

    http://www.jb51.net/article/83319.htm   这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继 ...

  4. Android项目实战登录&注册

    由于项目中大部分界面都有一个后退键和一个标题栏,为避免代码冗杂以及便于利用,我们可以将后推荐和标题栏单独抽取出来定义一个标题栏布局,在 res/layout 目录下新建一个 Layout resour ...

  5. Android——Activity中的六个主要函数

    Android Activity中的六个主要函数 Android中一个Activity一般都需要实现六个函数: onCreate(), onStart(), onResume(),onPause(), ...

  6. Android计算器简单逻辑实现

    Android计算器简单逻辑实现 引言: 我的android计算器的实现方式是:按钮输入一次,就处理一次. 但是如果你学过数据结构(栈),就可以使用表达式解析(前缀,后缀)处理. 而这个方式已经很成熟 ...

  7. Android项目实战登录&注册

    由于项目中大部分界面都有一个后退键和一个标题栏,为避免代码冗杂以及便于利用,我们可以将后推荐和标题栏单独抽取出来定义一个标题栏布局,在 res/layout 目录下新建一个 Layout resour ...

  8. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  9. request_irq() | 注册中断服务函数【转】

    本文转载自:http://blog.csdn.net/wealoong/article/details/7566546#t0 参考  : ARM Linux 中断机制分析.pdf linux-2.6. ...

随机推荐

  1. 【图像处理】FFmpeg解码H264及swscale缩放详解

      http://blog.csdn.net/gubenpeiyuan/article/details/19548019 主题 FFmpeg 本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何 ...

  2. HDFS之JAVAAPI

    JAVAAPI 上传小文件 代码

  3. layui checkbox , radio 清除所有选中项

    方法: $(selector).prop('cjecked', false); form.render(); 使用示例: // 清除radio选中 $('input[name=ymd]').prop( ...

  4. Stream系列(十五)File方法使用

    文件读写 视频讲解:https://www.bilibili.com/video/av78612785/ EmployeeTestCase.java package com.example.demo; ...

  5. 基于JAVA Socket的底层原理分析及工具实现

    前言 在工作开始之前,我们先来了解一下Socket 所谓Socket,又被称作套接字,它是一个抽象层,简单来说就是存在于不同平台(os)的公共接口.学过网络的同学可以把它理解为基于传输TCP/IP协议 ...

  6. idea的spring整合基于xml文件配置的mybatis报Invalid bound statement (not found): com.music.dao.MusicDao.findAll的问题

    一. 题主当时就是自己尝试整合spring和mybatis的时候遇到了这个问题,当时题主只看到了用注解的方式配置的dao层,题主用的是xml文件配置的形式, 而且坑爹的是题主的两个文件的路径写的也不一 ...

  7. 【Python】【demo实验15】【练习实例】【两个数范围内素数的统计】

    原题: 判断101-200之间有多少个素数,并输出所有素数. 关于素数的统计,之前已经做过相应的实验了,参考:[显示素数,显示两个数范围内的所有素数] 原题给出的解法,使用math的sqrt函数,这个 ...

  8. SpringBoot起飞系列-国际化(六)

    一.前言 国际化这个功能可能我们不常用,但是在有需要的地方还是必须要上的,今天我们就来看一下怎么在我们的web开发中配置国际化,让我们的网站可以根据语言来展示不同的形式.本文接续上一篇SpringBo ...

  9. Java中的自动拆装箱(转)

    出处: 一文读懂什么是Java中的自动拆装箱 本文主要介绍Java中的自动拆箱与自动装箱的有关知识.  基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我 ...

  10. 清除vs2005、vs2008起始页最近打开项目

    有时候vs2005起始最近打开项目过多很想清除掉,但打遍了也没找到清除选项在哪里,今天找到了方法,发上来和大家共享. 方法一手工操作方法:1)删除最近打开的文件运行regedit,打开HKEY_CUR ...