- 准备着手做计算器的小demo,我的计划是先按照书里面计算器的布局敲一遍,理解之后在这个基础上完善计算器的功能。
- 完善功能的步骤:
1.给需要操作的组件加上ID,注册监听器。
2.确定点击各个按钮后要执行的操作。运算符按钮点击时进行的操作封装在operatorClick(View e)中,数字按钮点击时进行的操作封装在numberClick(View e)中,等号按钮点击时进行的操作封装在equalClick()中。
(1)如果点击的是运算符号按钮,改变按钮颜色,保存该运算符并把文本的内容保存在成员变量letf中,表示表达式的左边;
(2)数字和小数点按钮的功能是在文本中显示输入的信息。
①点击小数点按钮时,要先判断文本中是否已经包含小数点,如果没有,文本中加上小数点,有则不加。另外,如果文本是“错误”提示时,不加小数点。
②点击数字按钮时,要确定当前是否需要清空文本。
使用成员变量flag(布尔值)来判断,初始化为true,该值在以下几种情况中设置:
a.在文本产生“错误”提示时,点击运算符按钮、“清除”按钮和等号按钮时,设置为true;
b.点击数字按钮时,判断是否为true,若是清空文本,并把flag设置为false。
- 问题:
语句顺序问题:调试的时候发现点击清除文本后,在点击数字按钮之前输入的数字还在,新点击的数字是添加在上次文本的结尾。原因是把获取文本框内容的语句放到了OnClick()方法外边,所以每次调用的时候这个字符串没有更新,一直保留之前输入的数字。
//文本框中的内容
String textContent = (String)text.getText();
获取资源文件中的color:不能使用R.color.颜色名调用,根据程序提示使用getResources().getColor(R.color.orange)。
- 以下是源代码:
(1)MainActivity.java
package com.example.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
//布局中的各个组件
private TextView text;
private Button button_clear;
private Button button_one;
private Button button_two;
private Button button_three;
private Button button_add;
private Button button_four;
private Button button_five;
private Button button_six;
private Button button_subtract;
private Button button_seven;
private Button button_eight;
private Button button_nine;
private Button button_multiply;
private Button button_point;
private Button button_zero;
private Button button_equal_to;
private Button button_divide;
//表达式左边的值
private float left = 0;
//表达式右边的值
private float right = 0;
//运算结果
private float result = 0;
//运算符
private String signal = "";
//判断当前是否已经点击运算符,需不需要清零
private boolean flag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView(); //获取布局中的组件
setListener(); //注册监听器
//初始化运算符按钮的颜色
buttonColor();
}
// findView():获取布局中的组件
private void findView(){
text = (TextView)findViewById(R.id.text);
button_clear = (Button)findViewById(R.id.button_clear);
button_one = (Button)findViewById(R.id.button_one);
button_two = (Button)findViewById(R.id.button_two);
button_three = (Button)findViewById(R.id.button_three);
button_add = (Button)findViewById(R.id.button_add);
button_four = (Button)findViewById(R.id.button_four);
button_five = (Button)findViewById(R.id.button_five);
button_six = (Button)findViewById(R.id.button_six);
button_subtract = (Button)findViewById(R.id.button_subtract);
button_seven = (Button)findViewById(R.id.button_seven);
button_eight = (Button)findViewById(R.id.button_eight);
button_nine = (Button)findViewById(R.id.button_nine);
button_multiply = (Button)findViewById(R.id.button_multiply);
button_point = (Button)findViewById(R.id.button_point);
button_zero = (Button)findViewById(R.id.button_zero);
button_equal_to = (Button)findViewById(R.id.button_equal_to);
button_divide = (Button)findViewById(R.id.button_divide);
}
// setListener():给各组件注册监听器
private void setListener(){
mClick click = new mClick();
button_clear.setOnClickListener(click);
button_one.setOnClickListener(click);
button_two.setOnClickListener(click);
button_three.setOnClickListener(click);
button_add.setOnClickListener(click);
button_four.setOnClickListener(click);
button_five.setOnClickListener(click);
button_six.setOnClickListener(click);
button_subtract.setOnClickListener(click);
button_seven.setOnClickListener(click);
button_eight.setOnClickListener(click);
button_nine.setOnClickListener(click);
button_multiply.setOnClickListener(click);
button_point.setOnClickListener(click);
button_zero.setOnClickListener(click);
button_equal_to.setOnClickListener(click);
button_divide.setOnClickListener(click);
}
// 初始化运算符按钮的颜色
private void buttonColor(){
button_add.setBackgroundColor(getResources().getColor(R.color.orange));
button_subtract.setBackgroundColor(getResources().getColor(R.color.orange));
button_multiply.setBackgroundColor(getResources().getColor(R.color.orange));
button_divide.setBackgroundColor(getResources().getColor(R.color.orange));
}
// 定义实现监听接口的类,实现的是View类的内部接口OnClickListener
class mClick implements View.OnClickListener {
@Override
public void onClick(View e) {
//文本框中的内容
String textContent = (String)text.getText();
//当点击的按钮是运算符
if (e == button_add || e == button_subtract || e == button_multiply || e == button_divide) {
operatorClick(e);
} else if (e == button_clear){
//点击“清除”按钮,文本设置为0
text.setText("0");
left = 0;
right = 0;
result = 0;
signal = "";
flag = true;
buttonColor();
} else if (e == button_point){
//点击“小数点”按钮,先判断是否已经有小数点
if (textContent.indexOf(".") == -1 && !(textContent.equals("错误"))) textContent += ".";
text.setText(textContent);
} else if (e == button_equal_to){
//点击“=”按钮,计算结果
equalClick();
} else {
//点击的是数字按钮
numberClick(e);
}
}
}
//运算符的按钮被点击时执行的操作,在监听器的onClick()中调用
private void operatorClick(View e) {
//文本框中的内容
String textContent = (String)text.getText();
//运算符按钮恢复初始颜色
buttonColor();
//如果文本是“错误”提示,初始化并退出函数
if (textContent.equals("错误")){
left = 0;
right = 0;
signal = "";
return;
}
//点击各运算符按钮进行的操作
if (e == button_add) {
signal = "+";
flag = true;
left = Float.parseFloat(textContent);
button_add.setBackgroundColor(getResources().getColor(R.color.pin));
} else if (e == button_subtract) {
signal = "-";
flag = true;
left = Float.parseFloat(textContent);
button_subtract.setBackgroundColor(getResources().getColor(R.color.pin));
} else if (e == button_multiply){
signal = "*";
flag = true;
left = Float.parseFloat(textContent);
button_multiply.setBackgroundColor(getResources().getColor(R.color.pin));
} else if (e == button_divide){
signal = "/";
flag = true;
left = Float.parseFloat(textContent);
button_divide.setBackgroundColor(getResources().getColor(R.color.pin));
}
}
//数字按钮被点击时执行的操作
private void numberClick(View e){
if(flag){
text.setText("");
flag = false;
}
//文本框中的内容
String textContent = (String)text.getText();
//点击数字按钮,把按钮上的数字添加到文本框上,如果文本为0,先去掉0
// if (Float.parseFloat(textContent) == 0 || textContent.equals("错误")) textContent = "";
if (e == button_one) textContent = "1";
if (e == button_two) textContent += "2";
if (e == button_three) textContent += "3";
if (e == button_four) textContent += "4";
if (e == button_five) textContent += "5";
if (e == button_six) textContent += "6";
if (e == button_seven) textContent += "7";
if (e == button_eight) textContent += "8";
if (e == button_nine) textContent += "9";
if (e == button_zero) textContent += "0";
text.setText(textContent);
}
//等号按钮被点击时执行的操作,计算结果
private void equalClick(){
String textContent = (String)text.getText();
right = Float.parseFloat(textContent);
if(signal == "/" && right == 0){ //除数为零-->错误
text.setText("错误");
left = 0;
right = 0;
result = 0;
signal = "";
buttonColor();
}else if(signal != "" && !(textContent.equals("错误"))){
if(right == 0) {
text.setText("错误");
}
if(signal == "+"){
result = left + right;
} else if(signal == "-"){
result = left - right;
} else if(signal == "*"){
result = left * right;
} else if(signal == "/"){
result = left / right;
}
text.setText(String.valueOf(result));
left = 0;
right = 0;
result = 0;
signal = "";
buttonColor();
}
flag = true;
}
}
(2)activity_main.xml(布局)
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:rowCount="6"
android:columnCount="4">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
android:layout_marginLeft="4dp"
android:gravity="left"
android:text="@string/zero"
android:textSize="50sp"
/>
<Button
android:id="@+id/button_clear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
android:text="@string/clear"
android:textSize="26sp"/>
<Button android:id="@+id/button_one" android:text="@string/one" android:textSize="26sp" />
<Button android:id="@+id/button_two" android:text="@string/two" android:textSize="26sp" />
<Button android:id="@+id/button_three" android:text="@string/three" android:textSize="26sp" />
<Button android:id="@+id/button_add" android:text="@string/add" android:textSize="26sp" />
<Button android:id="@+id/button_four" android:text="@string/four" android:textSize="26sp" />
<Button android:id="@+id/button_five" android:text="@string/five" android:textSize="26sp" />
<Button android:id="@+id/button_six" android:text="@string/six" android:textSize="26sp" />
<Button android:id="@+id/button_subtract" android:text="@string/subtract" android:textSize="26sp" />
<Button android:id="@+id/button_seven" android:text="@string/seven" android:textSize="26sp" />
<Button android:id="@+id/button_eight" android:text="@string/eight" android:textSize="26sp" />
<Button android:id="@+id/button_nine" android:text="@string/nine" android:textSize="26sp" />
<Button android:id="@+id/button_multiply" android:text="@string/multiply" android:textSize="26sp" />
<Button android:id="@+id/button_point" android:text="@string/point" android:textSize="26sp" />
<Button android:id="@+id/button_zero" android:text="@string/zero" android:textSize="26sp" />
<Button android:id="@+id/button_equal_to" android:text="@string/equal_to" android:textSize="26sp" />
<Button android:id="@+id/button_divide" android:text="@string/divide" android:textSize="26sp" />
</GridLayout>
(3)color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="red">#ff4400</color>
<color name="orange">#f58220</color>
<color name="pin">#feeeed</color>
</resources>
(4)strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">app</string>
<string name="hello_world">Hello world!</string>
<string name="clear">清除</string>
<string name="one">1</string>
<string name="two">2</string>
<string name="three">3</string>
<string name="add">+</string>
<string name="four">4</string>
<string name="five">5</string>
<string name="six">6</string>
<string name="subtract">-</string>
<string name="seven">7</string>
<string name="eight">8</string>
<string name="nine">9</string>
<string name="multiply">*</string>
<string name="point">.</string>
<string name="zero">0</string>
<string name="equal_to">=</string>
<string name="divide">/</string>
</resources>
- 运行截图: