安卓计算器--开发日志

  • 准备着手做计算器的小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>
  • 运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值