菜鸟学Android编程——简单计算器《一》

菜鸟瞎搞,高手莫进

本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢?

于是就冒冒失失的开撸了。

简单计算器嘛,功能当然很少,加减乘除就可以。

第一步:设计布局文件

界面如下图:

菜鸟学Android编程——简单计算器《一》

由于刚开始学Android,对布局文件也不是很了解,边查边找,最后凑合着写好了布局文件。

注意事项:此布局文件用到了GridLayout布局,是在Android4.0以上才出现的(不知道谷歌有没有开发相应的包来适配4.0以下版本)。

有关GridLayout的相关知识,大家可以参考那些网络大牛没写的博客,这里只是简单应用。

上代码了:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.beiyan.study.MainActivity" > <TextView
android:id="@+id/tvScreen"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:textColor="#2e8b57"
android:textSize="30dp" /> <GridLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="fill_horizontal"
android:layout_marginLeft="5dp"
android:columnCount="4"
android:rowCount="5" > <Button
android:id="@+id/btC"
android:text="C"
android:textColor="#8b2500" /> <Button
android:id="@+id/btDelete"
android:text="←"
android:textColor="#8b2500" /> <Button
android:id="@+id/btDivide"
android:text="÷"
android:textColor="#8b2500" /> <Button
android:id="@+id/btMultiply"
android:text="X"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt7"
android:text="7"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt8"
android:text="8"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt9"
android:text="9"
android:textColor="#8b2500" /> <Button
android:id="@+id/btSub"
android:text="-"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt4"
android:text="4"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt5"
android:text="5"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt6"
android:text="6"
android:textColor="#8b2500" /> <Button
android:id="@+id/btAdd"
android:text="+"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt1"
android:text="1"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt2"
android:text="2"
android:textColor="#8b2500" /> <Button
android:id="@+id/bt3"
android:text="3"
android:textColor="#8b2500" /> <Button
android:id="@+id/btSum"
android:layout_gravity="fill"
android:layout_rowSpan="2"
android:text="="
android:textColor="#8b2500" /> <Button
android:id="@+id/bt0"
android:layout_columnSpan="2"
android:layout_gravity="fill"
android:text="0"
android:textColor="#8b2500" /> <Button
android:id="@+id/btDot"
android:text="."
android:textColor="#8b2500" />
</GridLayout>
<TextView
android:id="@+id/tvTest"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:text="测试版"/> </LinearLayout>

第二步:编写Java类文件

  这里分几个模块来写

  (1)0-9    10个按钮的OnClick()事件

  (2)+-*/  10个按钮的OnClick()事件

  (3)用于计算的内部类

  (4)其他按钮的OnClick()事件

这里就直接把全部代码附上吧:

 package com.beiyan.study;

 import java.math.BigDecimal;
import com.beiyan.study.R.id;
import android.R.bool;
import android.R.integer;
import android.R.string;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.style.ClickableSpan;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends ActionBarActivity { // [start] 定义按钮
// 定义textView
private TextView tv;
// private TextView tvTest; // 0-9 数字键定义
private int[] btNumId = { R.id.bt0, R.id.bt1, R.id.bt2, R.id.bt3, R.id.bt4,
R.id.bt5, R.id.bt6, R.id.bt7, R.id.bt8, R.id.bt9 };
private Button[] buttonNums = new Button[btNumId.length]; // +-*/,清除,回退 Dot按钮定义
private Button btAdd;
private Button btSub;
private Button btMult;
private Button btDiv;
private Button btSum;
private Button btC;
private Button btBack;
private Button btDot; // 定义全局变量
private String stringNum1 = ""; // 第一个运算数
private String stringNum2 = ""; // 第二个运算数 private byte numFlg = 0; // 用于指示是否开始一个新的输入
private byte calculFlg = 0; // 用于表示输入的运算符
private int firstFlg = 0; // 指示第一个数是输入完成 // [end] @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 设置各个按钮
for (int i = 0; i < btNumId.length; i++) {
buttonNums[i] = (Button) findViewById(btNumId[i]);
// 设置OnClick()事件
buttonNums[i].setOnClickListener(new btNumClick() {
});
}
btAdd = (Button) findViewById(R.id.btAdd);
btSub = (Button) findViewById(R.id.btSub);
btMult = (Button) findViewById(R.id.btMultiply);
btDiv = (Button) findViewById(R.id.btDivide);
btSum = (Button) findViewById(R.id.btSum); btC = (Button) findViewById(R.id.btC);
btBack = (Button) findViewById(R.id.btDelete); btDot = (Button) findViewById(R.id.btDot);
tv = (TextView) findViewById(R.id.tvScreen);
// tvTest = (TextView) findViewById(R.id.tvTest);
tv.setText("0");
btAdd.setOnClickListener(new btCalculClick() {
});
btSub.setOnClickListener(new btCalculClick() {
});
btMult.setOnClickListener(new btCalculClick() {
});
btDiv.setOnClickListener(new btCalculClick() {
});
// = 按钮设置OnClick()事件
btSum.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (firstFlg == 0) {
stringNum1 = tv.getText().toString().trim();
firstFlg = 1;
} else {
stringNum2 = tv.getText().toString().trim();
calculFun calcul = new calculFun();
stringNum1 = calcul.calculFun(stringNum1, stringNum2,
calculFlg);
tv.setText(stringNum1);
stringNum2 = "";
firstFlg = 0;
calculFlg = 0;
}
}
}); // Back键设置OnClick()事件
btBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String strTem = tv.getText().toString();
if (strTem.length() == 1)
tv.setText("0");
else {
String strTarget;
StringBuffer sb = new StringBuffer();
char[] charTem = strTem.toCharArray();
for (int i = 0; i < charTem.length - 1; i++) {
sb.append(charTem[i]);
}
strTarget = sb.toString();
tv.setText(strTarget);
}
}
}); // dot 按键设置OnClick()事件
btDot.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
char[] charTem = tv.getText().toString().trim().toCharArray();
int n = 0;
for (int i = 0; i < charTem.length; i++) {
if (charTem[i] == '.')
n++;
}
if (n == 0)
tv.setText(tv.getText().toString().trim() + ".");
}
}); // C键设置OnClick()事件
btC.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
tv.setText("0");
stringNum1 = "";
stringNum2 = "";
numFlg = 0;
firstFlg = 0;
calculFlg = 0;
}
}); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} // 定义一个内部类,继承自OnClickListener,用于0-9按钮的点击事件
class btNumClick implements OnClickListener {
@Override
public void onClick(View v) {
// tvTest.setText(((Button) v).getText().toString().trim() + " "
// + tv.getText().toString().trim());
if (numFlg == 0) {
if (tv.getText().toString().trim().equals("0")) {
tv.setText(((Button) v).getText().toString().trim());
} else {
tv.setText(tv.getText().toString().trim()
+ ((Button) v).getText().toString().trim());
}
} else {
tv.setText(((Button) v).getText().toString().trim());
numFlg = 0;
}
}
} // 定义一个内部类,用于计算两个BigDecimal类型数据的四则运算
class calculFun {
private String calculFun(String str1, String str2, int n) {
BigDecimal bigDecimal1 = new BigDecimal(str1);
BigDecimal bigDecimal2 = new BigDecimal(str2);
BigDecimal bigDecimalsum = new BigDecimal("0");
switch (n) {
case 1:
bigDecimalsum = bigDecimal1.add(bigDecimal2);
break;
case 2:
bigDecimalsum = bigDecimal1.subtract(bigDecimal2);
break;
case 3:
bigDecimalsum = bigDecimal1.multiply(bigDecimal2);
break;
case 4: {
// 除数不能为零,加一个判断
if (stringNum2.equals("0")) {
Toast.makeText(getApplicationContext(), "除数不能为0哟",
Toast.LENGTH_SHORT).show();
tv.setText("0"); return "0";
} else
bigDecimalsum = bigDecimal1.divide(bigDecimal2);
}
break;
default:
break;
}
return bigDecimalsum.toString();
}
} // 定义一个内部类,继承自OnClickListener,用于+-*/按钮的点击事件
class btCalculClick implements OnClickListener { @Override
public void onClick(View v) {
if (numFlg == 1) {
stringNum1 = tv.getText().toString().trim();
firstFlg = 1;
if (calculFlg == 4 || calculFlg == 1 || calculFlg == 2
|| calculFlg == 3)
numFlg = 1;
else
numFlg = 0;
switch (((Button) v).getId()) {
case R.id.btAdd:
calculFlg = 1;
break;
case R.id.btSub:
calculFlg = 2;
break;
case R.id.btMultiply:
calculFlg = 3;
break;
case R.id.btDivide:
calculFlg = 4;
break;
default:
break;
}
} else {
if (firstFlg == 0) { stringNum1 = tv.getText().toString().trim();
firstFlg = 1;
numFlg = 1;
switch (((Button) v).getId()) {
case R.id.btAdd:
calculFlg = 1;
break;
case R.id.btSub:
calculFlg = 2;
break;
case R.id.btMultiply:
calculFlg = 3;
break;
case R.id.btDivide:
calculFlg = 4;
break;
default:
break;
}
} else {
stringNum2 = tv.getText().toString().trim();
calculFun calcul = new calculFun();
stringNum1 = calcul.calculFun(stringNum1, stringNum2,
calculFlg);
stringNum2 = "";
tv.setText(stringNum1);
switch (((Button) v).getId()) {
case R.id.btAdd:
calculFlg = 1;
break;
case R.id.btSub:
calculFlg = 2;
break;
case R.id.btMultiply:
calculFlg = 3;
break;
case R.id.btDivide:
calculFlg = 4;
break;
default:
break;
}
firstFlg = 1;
numFlg = 1;
}
}
} }
}

这里也附上生成好的apk文件,百度网盘下载地址(还没找到博客上面怎么添加附件)

http://pan.baidu.com/s/1gdd7b5x

第三步:总结遇到的问题

  (1)第一个问题是 "==" 与 equals() 的区别

    在这个问题上卡了好久,这里简单说一下吧(个人理解)

    当进行两个变量比较时:

     "=="  用于byte,short,char,int,long,float,double,boolean基本类型的比较

    equals() 用于String等符合类型的比较

    简单例子:

    

        int num1=123;
int num2=123;
System.out.println("1 "+(num1==num2)); String str1="123";
String str2=new String("123");
System.out.println("2 "+(str1==str2));
System.out.println("3 "+(str1.equals(str2)));

    结果是:

        1      true

        2  false

        3   true

    第二个判断和第三个判断 所表示的值是一样的,为什么结果却不同呢?

        本人的理解,不知道对错,欢迎大家指正

          对于基本数据类型的比较,没有equals(),只有“==”

          所以“==”是比较两个变量所占用的存储地址(或者其他)是否相同,上例中 num1和num2虽然变量名不同,但是所表示的值相同,所以在数据集中两个变量存储在一个位置。所以比较结果为true。

          对于equals() ,用来比较复杂数据类型的表示的值是否相同,只要两个变量所表示的值一样,就显示为true。上例中,str1和str2,值相同,但存储地址不同,所以出现不同的结果。

          关于“==”和equals() 更详尽的解释,参考http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html

                             http://blog.csdn.net/winer2008/article/details/4059789

  (2)第二个问题是程序流程的问题。

      刚开始时,对整个计算器的流程不是很能把握,花了好长时间,才弄好。

      这里想对自己说

        写程序最重要的是算法流程,动手写代码之前一定要在心里或者纸上有一个详尽的流程。

第四步:下一步改进的方向

  (1)由于对布局不是很熟悉,导致所采用的布局不是很合理。在大屏手机上面程序不会进行相应的拉伸,显得很突兀。

  (2)只有简单的加减乘除,以后争取实现平时所用的科学计算器的功能。

  (3)程序流程不是很合理,代码不是很精简。这也是今后改进的方向。

上一篇:leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)


下一篇:Web前端温故知新-CSS基础