设计内容:
应用网格布局设计一个计算器并实现其具体功能
界面设计:
界面采用网格布局,在界面设计区域设置一个6行4列的网格布局,第一行为显示数据的文本标签,第2行为清楚数据的按钮,第3~6行均划分为4列,共安排16个按钮,分别代表数字0、1、2...、9及加、减、乘、除、等号等符号.布局如下
布局源代码:
<?xml version="1.0" encoding="utf-8"?>
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<!-- 结果 -->
<EditText
android:id="@+id/EV_result"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="right"
android:cursorVisible="false"
android:textSize="25sp"
android:paddingBottom="0dp"
android:text="0" />
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="4">
<Button
android:id="@+id/Btn_C"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
android:layout_gravity="fill"
android:text="清除"/>
<Button
android:id="@+id/Btn_Num1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"/>
<Button
android:id="@+id/Btn_Num2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2"/>
<Button
android:id="@+id/Btn_Num3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3"/>
<Button
android:id="@+id/Btn_Addition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+"/>
<Button
android:id="@+id/Btn_Num4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4"/>
<Button
android:id="@+id/Btn_Num5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5"/>
<Button
android:id="@+id/Btn_Num6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="6"/>
<Button
android:id="@+id/Btn_Subtraction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-"/>
<Button
android:id="@+id/Btn_Num7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="7"/>
<Button
android:id="@+id/Btn_Num8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8"/>
<Button
android:id="@+id/Btn_Num9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="9"/>
<Button
android:id="@+id/Btn_Multiplication"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"/>
<Button
android:id="@+id/Btn_DecimalPoint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="."/>
<Button
android:id="@+id/Btn_Num0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"/>
<Button
android:id="@+id/Btn_Equal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="="/>
<Button
android:id="@+id/Btn_Division"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="/"/>
</GridLayout>
< /LinearLayout>
逻辑设计:
获取各按钮;
各按钮添加监听器及监听事件;
源代码如下:
package com.example.administrator.example1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText EV_Result; // 结果框
private double currentResult = 0.0; // 存储数字及结果
private boolean firstDigit = true; // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
private String operator = "="; // 当前运算的运算符
private boolean operateValidFlag = true; // 操作是否合法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main );
// 控件初始化及添加监听事件
this.init();
}
/**
* 点击事件重载方法
* @param v 当前点击的控件
*/
@Override
public void onClick(View v) {
String pre = ((Button) v).getText().toString();
Log.i("TAG", pre);
switch (v.getId()) {
case R.id.Btn_C:
setBtn_C();
break;
case R.id.Btn_Num0:
case R.id.Btn_Num1:
case R.id.Btn_Num2:
case R.id.Btn_Num3:
case R.id.Btn_Num4:
case R.id.Btn_Num5:
case R.id.Btn_Num6:
case R.id.Btn_Num7:
case R.id.Btn_Num8:
case R.id.Btn_Num9:
case R.id.Btn_DecimalPoint:
setNum(pre);
break;
case R.id.Btn_Subtraction:
case R.id.Btn_Addition:
case R.id.Btn_Multiplication:
case R.id.Btn_Division:
case R.id.Btn_Equal:
setOperator(pre);
break;
}
}
/**
* 点击运算符处理
* @param label 接收当前点击的运算符
*/
public void setOperator(String label) {
switch (operator){
case "/":
// 除法运算
// 如果当前结果文本框中的值等于0
if (getNumFromEV_Result() == 0.0) {
// 操作不合法
operateValidFlag = false;
EV_Result.setText("除数不能为零!");
} else {
currentResult /= getNumFromEV_Result();
}
break;
case "+":
// 加法运算
currentResult += getNumFromEV_Result();
break;
case "-":
// 减法运算
currentResult -= getNumFromEV_Result();
break;
case "*":
// 加法运算
currentResult *= getNumFromEV_Result();
break;
case "%":
// 加法运算
currentResult %= getNumFromEV_Result();
break;
case "=":
// 赋值运算
currentResult = getNumFromEV_Result();
break;
}
if (operateValidFlag) {
// 双精度浮点数的运算
long t1;
double t2;
t1 = (long) currentResult;
t2 = currentResult - t1;
if (t2 == 0) {
EV_Result.setText(String.valueOf(t1));
} else {
EV_Result.setText(String.valueOf(currentResult));
}
}
// 运算符等于用户按的按钮
operator = label;
firstDigit = true;
operateValidFlag = true;
}
/**
* 点击数字处理
* @param n 接收当前点击的数字
*/
public void setNum(String n) {
if (firstDigit) {
// 输入的第一个数字
EV_Result.setText(n);
} else if ((n.equals(".")) && (!EV_Result.getText().toString().contains("."))) {
// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
String str = EV_Result.getText().toString();
str += ".";
EV_Result.setText(str);
} else if (!n.equals(".")) {
// 如果输入的不是小数点,则将数字附在结果文本框的后面
String str = EV_Result.getText().toString();
str += n;
EV_Result.setText(str);
}
// 以后输入的肯定不是第一个数字了
firstDigit = false;
}
/**
* 从文本框中获取数字
*
* @return result
*/
public double getNumFromEV_Result() {
double result = 0;
try {
result = Double.valueOf(EV_Result.getText().toString());
} catch (NumberFormatException e) {
Log.i("TAG","您输入的不是数字");
}
return result;
}
/**
* 设置清空C键
*/
public void setBtn_C() {
EV_Result.setText("0");
firstDigit = true;
operator = "=";
}
/**
* 设置返回Back键
*/
public void setBtn_Back() {
String currentResult = EV_Result.getText().toString();
int i = currentResult.length();
if (i > 0) {
currentResult = currentResult.substring(0, i - 1); // 将文本最后一个字符去掉
if (currentResult.length() == 0) { // 如果没有了内容,初始化计算器的各种值
EV_Result.setText("0");
} else {
EV_Result.setText(currentResult); // 显示新的文本
}
}
}
/**
* 初始化控件
*/
public void init() {
EV_Result =(EditText)findViewById(R.id.EV_result);
// 第一行
Button Btn_C; // 清空结果框
// 第二行
Button Btn_Num1;
Button Btn_Num2;
Button Btn_Num3;
Button Btn_Addition; // 加法
// 第三行
Button Btn_Num4;
Button Btn_Num5;
Button Btn_Num6;
Button Btn_Subtraction; // 减法
// 第四行
Button Btn_Num7;
Button Btn_Num8;
Button Btn_Num9;
Button Btn_Multiplication; // 乘发
// 第五行
Button Btn_DecimalPoint; // 小数点
Button Btn_Num0;
Button Btn_Equal; // 等于
Button Btn_Division; // 除法
Btn_C = (Button)findViewById(R.id.Btn_C);
Btn_Num1 = (Button)findViewById(R.id.Btn_Num1);
Btn_Num2 = (Button)findViewById(R.id.Btn_Num2);
Btn_Num3 = (Button)findViewById(R.id.Btn_Num3);
Btn_Addition = (Button)findViewById(R.id.Btn_Addition);
Btn_Num4 = (Button)findViewById(R.id.Btn_Num4);
Btn_Num5 = (Button)findViewById(R.id.Btn_Num5);
Btn_Num6 = (Button)findViewById(R.id.Btn_Num6);
Btn_Subtraction = (Button)findViewById(R.id.Btn_Subtraction);
Btn_Num7 = (Button)findViewById(R.id.Btn_Num7);
Btn_Num8 = (Button)findViewById(R.id.Btn_Num8);
Btn_Num9 = (Button)findViewById(R.id.Btn_Num9);
Btn_Multiplication = (Button)findViewById(R.id.Btn_Multiplication);
Btn_DecimalPoint = (Button)findViewById(R.id.Btn_DecimalPoint);
Btn_Num0 = (Button)findViewById(R.id.Btn_Num0);
Btn_Equal = (Button)findViewById(R.id.Btn_Equal);
Btn_Division = (Button)findViewById(R.id.Btn_Division);
Btn_C.setOnClickListener(this);
Btn_Num1.setOnClickListener(this);
Btn_Num2.setOnClickListener(this);
Btn_Num3.setOnClickListener(this);
Btn_Addition.setOnClickListener(this);
Btn_Num4.setOnClickListener(this);
Btn_Num5.setOnClickListener(this);
Btn_Num6.setOnClickListener(this);
Btn_Subtraction.setOnClickListener(this);
Btn_Num7.setOnClickListener(this);
Btn_Num8.setOnClickListener(this);
Btn_Num9.setOnClickListener(this);
Btn_Multiplication.setOnClickListener(this);
Btn_DecimalPoint.setOnClickListener(this);
Btn_Num0.setOnClickListener(this);
Btn_Equal.setOnClickListener(this);
Btn_Division.setOnClickListener(this);
}
}
效果图:
问题及总结:
在开发计算器的过程中我遇到的最大问题就是编译调试的过程中找不到R的程序包,通过百度,我解决了此问题。在此计算器中,有不足的地方,我在进行加减乘除时,并不会显示出它的符号,同时谁减谁或谁加谁等也不会显示,让使用的客户容易忘记了计算到哪一步,但结果是正确的。
这个项目让我意识到我的java基础不稳定,很多都是要重新翻开书本才能完成此计算器的逻功能。
一个简单的计算器就完成了。通过完成这个应用程序,让我可以对所学的知识进行“活学活用”,也让我深刻明白了,对于程序开发这一方向而言,真的是 “纸上得来终觉浅,绝知此事要躬行” 啊!
真的,很多事情在你的思想中可能是这样,但是当你真正去动手操作的时候就会发现,原来很多事情都和想象之中的不太一样。