安卓计算器的总结

来源:互联网 发布:无损播放软件排名 编辑:程序博客网 时间:2024/06/06 01:09

嗯 上周开始了安卓的学习,本周利用了简单的控件实现了一个简单的计算器,

布局控件

布局采用最简单的线性布局,控件就是用了几个Button和TextView,上代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#84bf96"
android:orientation="vertical">

<TextView
android:id="@+id/atext"
android:layout_width="match_parent"
android:layout_height="120dp"
android:maxHeight="120dp"
android:maxLines="6"
android:textSize="50sp"
android:scrollHorizontally="false"/>
<TextView
android:id="@+id/aatext"
android:layout_width="match_parent"
android:layout_height="60dp"
android:textSize="50sp"
android:backgroundTint="#deab8a"
android:background="#f58f98"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">

<Button
android:id="@+id/button_DEL_All"
android:layout_weight="1"
android:background="@drawable/botton_1"
android:layout_height="match_parent"
android:text="C"
android:textSize="50sp"
android:layout_width="0dp" />

<Button
android:id="@+id/button_l_brackets"
android:background="@drawable/botton_1"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="("
android:textSize="40sp"
android:layout_width="0dp" />
<Button
android:id="@+id/button_r_brackets"
android:background="@drawable/botton_1"
android:layout_weight="1"
android:layout_height="match_parent"
android:text=")"
android:textSize="40sp"
android:layout_width="0dp" />
<Button
android:id="@+id/button_DEL"
android:layout_weight="1"
android:background="@drawable/botton_1"
android:layout_height="match_parent"
android:text="DEL"
android:textSize="25sp"
android:layout_width="0dp" />
<Button
android:id="@+id/button_Divide"
android:layout_weight="1"
android:background="@drawable/botton_1"
android:layout_height="match_parent"
android:text="/"
android:textSize="50sp"
android:layout_width="0dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"

android:layout_weight="1"
android:orientation="horizontal">
<Button
android:id="@+id/button_7"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="7"
android:background="@drawable/botton_1"
android:textSize="50sp"
android:layout_width="wrap_content" />
<Button
android:id="@+id/button_8"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/botton_1"
android:text="8"
android:textSize="50sp"
android:layout_width="wrap_content" />
<Button
android:id="@+id/button_9"
android:layout_weight="1"
android:layout_height="match_parent"
android:textSize="50sp"
android:text="9"
android:background="@drawable/botton_1"
android:layout_width="wrap_content" />
<Button
android:id="@+id/button_Multiply"
android:layout_weight="1"
android:layout_height="match_parent"
android:textSize="50sp"
android:background="@drawable/botton_1"
android:text="*"
android:layout_width="wrap_content" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"

android:orientation="horizontal">
<Button
android:id="@+id/button_4"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="4"
android:textSize="50sp"
android:background="@drawable/botton_1"
android:layout_width="wrap_content" />
<Button
android:id="@+id/button_5"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="5"
android:textSize="50sp"
android:background="@drawable/botton_1"
android:layout_width="wrap_content" />
<Button
android:id="@+id/button_6"
android:layout_weight="1"
android:layout_height="match_parent"
android:textSize="50sp"
android:text="6"
android:background="@drawable/botton_1"
android:layout_width="wrap_content" />

<Button
android:id="@+id/button_reduce"
android:layout_weight="1"
android:layout_height="match_parent"
android:textSize="50sp"
android:background="@drawable/botton_1"
android:text="-"
android:layout_width="wrap_content" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:id="@+id/button_1"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="1"
android:background="@drawable/botton_1"
android:textSize="50sp"
android:layout_width="wrap_content" />
<Button
android:id="@+id/button_2"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="2"
android:textSize="50sp"
android:background="@drawable/botton_1"
android:layout_width="wrap_content" />
<Button
android:id="@+id/button_3"
android:layout_weight="1"
android:layout_height="match_parent"
android:textSize="50sp"
android:text="3"
android:background="@drawable/botton_1"
android:layout_width="wrap_content" />
<Button
android:id="@+id/button_add"
android:layout_weight="1"
android:layout_height="match_parent"
android:textSize="50sp"
android:text="+"
android:background="@drawable/botton_1"
android:layout_width="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">

<Button
android:id="@+id/button_0"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="0"
android:background="@drawable/botton_1"
android:textSize="50sp"
android:layout_width="wrap_content" />

<Button
android:background="@drawable/botton_1"
android:id="@+id/button_point"
android:layout_height="match_parent"
android:text="."
android:textSize="50sp"
android:layout_width="wrap_content"
android:layout_weight="1" />

<Button
android:id="@+id/button_result"
android:layout_weight="13"
android:layout_height="match_parent"
android:textSize="50sp"
android:background="@drawable/button"
android:text="="
android:layout_width="wrap_content" />

</LinearLayout>

</LinearLayout>

Alt text

嗯 ,效果图就是这样,用了drawable里面自定义的一个button属性,这样就可以直接引用,而不用每个按键都需要自己去复制粘贴啦

以下是主活动中的代码

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.List;


public class MainActivity_1 extends AppCompatActivity implements View.OnClickListener{
private Button button1;
private Button button2;
private Button button3;
private Button button4;
private Button button5;
private Button button6;
private Button button7;
private Button button8;
private Button button9;
private Button button0;
private Button button_DELAll;
private Button button_DEL;
private Button button_l_brackets;
private Button button_r_brackets;
private Button button_Divide;
private Button button_Multiply;
private Button button_reduce;
private Button button_add;
private Button button_result;
private Button button_point;
private TextView textView;
private TextView textView1;

private int pointnum = 0;
private int i = 5;
private int l_brackets_num = 0;

private String aaa = "";
private String sss = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.atext);
textView1 = (TextView) findViewById(R.id.aatext);
button0 = (Button)findViewById(R.id.button_0);
button0.setOnClickListener(this);
button1 = (Button)findViewById(R.id.button_1);
button1.setOnClickListener(this);
button2 = (Button)findViewById(R.id.button_2);
button2.setOnClickListener(this);
button3 = (Button)findViewById(R.id.button_3);
button3.setOnClickListener(this);
button4 = (Button)findViewById(R.id.button_4);
button4.setOnClickListener(this);
button5 = (Button)findViewById(R.id.button_5);
button5.setOnClickListener(this);
button6 = (Button)findViewById(R.id.button_6);
button6.setOnClickListener(this);
button7 = (Button)findViewById(R.id.button_7);
button7.setOnClickListener(this);
button8 = (Button)findViewById(R.id.button_8);
button8.setOnClickListener(this);
button9 = (Button)findViewById(R.id.button_9);
button9.setOnClickListener(this);
button_DELAll = (Button)findViewById(R.id.button_DEL_All);
button_DELAll.setOnClickListener(this);
button_DEL = (Button)findViewById(R.id.button_DEL);
button_DEL.setOnClickListener(this);
button_l_brackets = (Button)findViewById(R.id.button_l_brackets);
button_l_brackets.setOnClickListener(this);
button_r_brackets = (Button)findViewById(R.id.button_r_brackets);
button_r_brackets.setOnClickListener(this);
button_add = (Button)findViewById(R.id.button_add);
button_add.setOnClickListener(this);
button_reduce = (Button)findViewById(R.id.button_reduce);
button_reduce.setOnClickListener(this);
button_Multiply = (Button)findViewById(R.id.button_Multiply);
button_Multiply.setOnClickListener(this);
button_Divide = (Button)findViewById(R.id.button_Divide);
button_Divide.setOnClickListener(this);
button_result = (Button)findViewById(R.id.button_result);
button_result.setOnClickListener(this);
button_point = (Button)findViewById(R.id.button_point);
button_point.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.button_1:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "1";
break;
case R.id.button_2:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "2";
break;
case R.id.button_3:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "3";
break;
case R.id.button_4:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "4";
break;
case R.id.button_5:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "5";
break;
case R.id.button_6:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "6";
break;
case R.id.button_7:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "7";
break;
case R.id.button_8:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "8";
break;
case R.id.button_9:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "9";
break;
case R.id.button_0:
if(aaa.length() > 0 && aaa.charAt(aaa.length()-1) == ')'){
break;
}
aaa += "0";
break;
case R.id.button_point:
if(pointnum == 0 && aaa.charAt(aaa.length()-1) != ')'){
pointnum += 1;
aaa += '.';
}

break;
case R.id.button_DEL_All:
sss = "";
aaa = "";
pointnum = 0;
break;
case R.id.button_DEL:
delate_last();
sss = "";
break;
case R.id.button_l_brackets:
l_brackets();
break;
case R.id.button_r_brackets:
r_brackets();
break;
case R.id.button_add:
if(aaa.length()>0){
Symbol();
if(aaa.charAt(aaa.length()-1) != '('){
aaa+='+';
}
}
pointnum = 0;
break;
case R.id.button_reduce:
if(aaa.length()>0){
Symbol();
if(aaa.charAt(aaa.length()-1) != '('){
aaa+='-';
}
}
pointnum = 0;
break;
case R.id.button_Multiply:
if(aaa.length()>0){
Symbol();
if(aaa.charAt(aaa.length()-1) != '('){
aaa+='*';
}
}
pointnum = 0;
break;
case R.id.button_Divide:
if(aaa.length()>0){
Symbol();
if(aaa.charAt(aaa.length()-1) != '('){
aaa+='/';
}
}
pointnum = 0;
break;
case R.id.button_result:
if(aaa.length() > 0){
Symbol();
}
if(aaa.length() > 0){
while (l_brackets_num > 0){
aaa+=')';
l_brackets_num-=1;
}
sss = aaa;
solve aa = new solve(sss);
sss = aa.result();
if(sss.length() > 14){
textView1.setTextSize(25);
}else if(sss.length() <= 14){
textView1.setTextSize(50);
}
}
break;
}
System.out.println("此时的小数点是"+l_brackets_num+"位");
textsize_1();//检测算式字符串的长度,调整算式显示的大小
textView.setText(aaa);
textView1.setText(sss);
}
public void Symbol(){
if(aaa.charAt(aaa.length()-1) == '.'){
aaa+='0';
}
if(aaa.charAt(aaa.length()-1) == '+'||
aaa.charAt(aaa.length()-1) == '-'||
aaa.charAt(aaa.length()-1) == '*'||
aaa.charAt(aaa.length()-1) == '/'){
delate_last();
}
}
public void r_brackets(){
if(aaa.charAt(aaa.length()-1) == '('){
return;
}
if(l_brackets_num > 0){
if(aaa.charAt(aaa.length()-1) == '.'){
aaa+='0';
}
if(aaa.charAt(aaa.length()-1) != '+'&&
aaa.charAt(aaa.length()-1) != '-'&&
aaa.charAt(aaa.length()-1) != '*'&&
aaa.charAt(aaa.length()-1) != '/'){
aaa+=')';
l_brackets_num-=1;
}
}
}
public void l_brackets(){
if(aaa.length() == 0){
aaa+= '(';
l_brackets_num += 1;
}else if(aaa.charAt(aaa.length()-1) == '+'||
aaa.charAt(aaa.length()-1) == '-'||
aaa.charAt(aaa.length()-1) == '*'||
aaa.charAt(aaa.length()-1) == '('||
aaa.charAt(aaa.length()-1) == '/'){
l_brackets_num += 1;
aaa+='(';
}
}
public int judge(){
if(aaa.length() > 0){
if(aaa.charAt(aaa.length()-1) == '+' ||
aaa.charAt(aaa.length()-1) == '-' ||
aaa.charAt(aaa.length()-1) == '*' ||
aaa.charAt(aaa.length()-1) == '/' ){
return 1;
}else {
return 0;
}
}else{
return -1;
}
}
public void delate_last(){
if(aaa.length()>0)
{
StringBuilder aa1 = new StringBuilder();
aa1.append(aaa);
aa1.deleteCharAt(aa1.length()-1);
aaa = "";
aaa += aa1;
}
}
public void textsize_1(){
if(aaa.length() > 28){
textView.setTextSize(25);
}else if(aaa.length() <= 28){
textView.setTextSize(50);
}
}
public void date(){
if( aaa.length() > 0 || aaa.charAt(aaa.length()-1) == '.'){
aaa+= "0";
}
if(aaa.length() > 0){
if(aaa.charAt(aaa.length()-1) == '+' ||
aaa.charAt(aaa.length()-1) == '-' ||
aaa.charAt(aaa.length()-1) == '*' ||
aaa.charAt(aaa.length()-1) == '/')
{
StringBuilder aa1 = new StringBuilder();
aa1.append(aaa);
aa1.deleteCharAt(aa1.length()-1);
aaa = "";
aaa += aa1;
}
}
}
}
  • 之前是用注册内部类的方式写的按键监听,学长发现后让我用这个实现接口的方法写,果然简洁了许多

    上计算部分的代码

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;


/**
* Created by yanghao on 2017/7/24.
*/


public class solve {
private String str = "";
private List<String> firststring = new ArrayList<String>();
private List<String> finalstring = new ArrayList<String>();
public solve(String str){
this.str = str;
}
public void Str_to_Strlist(){
String a = "";
int i = 0;
while(str.charAt(i) == '('){
firststring.add(str.substring(i,++i));
}
while (i < str.length()){
if(str.charAt(i) == '+' || str.charAt(i) == '-' ||str.charAt(i) == '*' ||
str.charAt(i) == '/'||str.charAt(i) == '(' ||str.charAt(i) == ')' ){
if(a.length()>0){
firststring.add(a);
}
firststring.add(str.charAt(i++)+"");
a = "";
}
if( i < str.length() &&str.charAt(i) != '+' &&
str.charAt(i) != '-' &&
str.charAt(i) != '*' &&
str.charAt(i) != '/' &&
str.charAt(i) != '(' &&
str.charAt(i) != ')' ){
a += str.substring(i,++i);
}
}
if( a != ""){
firststring.add(a);
}

}
public void mid_to_after(){
List<String> aaa = new ArrayList<String>();
while (firststring.size() > 0 ){
if(firststring.get(0).equals("+") || firststring.get(0).equals("-") ||
firststring.get(0).equals("*") || firststring.get(0).equals("/")||
firststring.get(0).equals("(") || firststring.get(0).equals(")") ){
aaa.add(firststring.remove(0));//先把字符串集合中的符号挪到临时符号集合
if(aaa.size() > 1){//当符号集合里面符号不止一个,就进行优先级判断
if(aaa.get(aaa.size()-1 ).equals("+") || aaa.get(aaa.size()-1 ).equals("-")){
if(aaa.get(aaa.size()-2 ).equals("*") ||
aaa.get(aaa.size()-2 ).equals("/")){
finalstring.add(aaa.remove(aaa.size()-2));
}
}else if(aaa.get(aaa.size()-1 ).equals(")")){
aaa.remove(aaa.size()-1);
while(aaa.get(aaa.size()-1).equals("(") == false){
finalstring.add(aaa.remove(aaa.size()-1));
}
aaa.remove(aaa.size()-1);
}
}
}else {
finalstring.add(firststring.remove(0));
}
}
while(aaa.size() > 0){
finalstring.add(aaa.remove(aaa.size()-1));
}
}
public String result(){
Str_to_Strlist();
mid_to_after();
int i = 0;
String a = "";
while(finalstring.size() > 1 ){
if (finalstring.get(i).equals("+") ||
finalstring.get(i).equals("-") ||
finalstring.get(i).equals("*") ||
finalstring.get(i).equals("/") ){
BigDecimal f1 = new BigDecimal(finalstring.get(i-2));
BigDecimal f2 = new BigDecimal(finalstring.get(i-1));
switch (finalstring.get(i)){
case "+":a = "" +f1.add(f2);
break;
case "-":a = "" + f1.subtract(f2);
break;
case "*":a = "" + f1.multiply(f2);
break;
case "/":a = "" + f1.divide(f2);
break;
default:break;
}
finalstring.remove(i--);
finalstring.remove(i--);
finalstring.remove(i--);
finalstring.add(++i,a);
}
i++;
}
return finalstring.get(0);
}
}
  • 这部分主要是将从按键得到的算式字符串进行处理,计算得到一个字符串答案,再次显示在屏幕上 

    1 . 主要是先将得来的字符串进行分割放在一个字符串集合当中,分割原理是数字自成一个字符串,符号自称一个字符串,具体代码见上面的 public void Str_to_Strlist() 方法 
    2.然后中缀表达式转后缀表达式,具体代码见 public void mid_to_after() 
    3.最后一个方法使计算过程,中间使用BigDecimal f1 = new BigDecimal(finalstring.get(i-2));将字符串强赚数字进行运算,运算完毕在进行+“”——————使它又重新变成字符串


新手第一次,有什么不对的欢迎大家指出来,谢谢
原创粉丝点击