开发环境 AS 基于 addroid7.0
开发一个计算机,首先要设置一个计算机的界面布局,有了控件之后才能注册监听器
布局代码如下
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<GridLayout 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:columnCount="4"
android:rowCount="6"
tools:context=".MainActivity">
<TextView
android:id="@+id/contentText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
android:layout_marginLeft="4px"
android:gravity="left"
android:text="0"
android:textSize="50dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt1"
android:layout_width="353dp"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
android:text="清除"
android:textSize="26sp" />
<Button
android:id="@+id/bt2"
android:layout_width="wrap_content"
android:text="1"
android:textSize="26sp" />
<Button
android:id="@+id/bt3"
android:text="2"
android:textSize="26sp" />
<Button
android:id="@+id/bt4"
android:text="3"
android:textSize="26sp" />
<Button
android:id="@+id/bt5"
android:text="+"
android:textSize="26sp" />
<Button
android:id="@+id/bt6"
android:text="4"
android:textSize="26sp" />
<Button
android:id="@+id/bt7"
android:text="5"
android:textSize="26sp" />
<Button
android:id="@+id/bt8"
android:text="6"
android:textSize="26sp" />
<Button
android:id="@+id/bt9"
android:text="-"
android:textSize="26sp" />
<Button
android:id="@+id/bt10"
android:text="7"
android:textSize="26sp" />
<Button
android:id="@+id/bt11"
android:text="8"
android:textSize="26sp" />
<Button
android:id="@+id/bt12"
android:text="9"
android:textSize="26sp" />
<Button
android:id="@+id/bt13"
android:text="*"
android:textSize="26sp" />
<Button
android:id="@+id/bt14"
android:text="."
android:textSize="26sp" />
<Button
android:id="@+id/bt15"
android:text="0"
android:textSize="26sp" />
<Button
android:id="@+id/bt16"
android:text="="
android:textSize="26sp" />
<Button
android:id="@+id/bt17"
android:text="/"
android:textSize="26sp" />
</GridLayout>
2.为控件内容,为控件显示键盘的文字
wenzi.xml
<resources>
<string name="app_name">计算器</string>
<string name="bt1">clear</string>
<string name="bt2">1</string>
<string name="bt3">2</string>
<string name="bt4">3</string>
<string name="bt5">+</string>
<string name="bt6">4</string>
<string name="bt7">5</string>
<string name="bt8">6</string>
<string name="bt9">-</string>
<string name="bt10">7</string>
<string name="bt11">8</string>
<string name="bt12">9</string>
<string name="bt13">*</string>
<string name="bt14">.</string>
<string name="bt15">0</string>
<string name="bt16">=</string>
<string name="bt17">/</string>
</resources>
2.逻辑设计
1.要为控件上设置一系列操作首先要明白它的逻辑,要怎样变写代码?
计算机,首先要处理的就是如何分隔数字与与运算符,当我们输入完第一个数字之后,我们会按下加减乘除的按钮,按下按钮之后我们会将前面输入的文字作为第一个需要运算的数字,第二个数字以运算符开始,等号结尾,我们将以运算符分隔的数字取出进行加减乘除运算。
2.其次,我们要设置运算符的优先级,比如,乘法和除法优先于加法和减法,当遇到同级运算符时,我们要从左到右运算
以下为具体实施
MainActivity.java
package com.example.bang.computer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button[] buttons=new Button[17];
private int[] ids=new int[]{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,R.id.bt10,R.id.bt11,R.id.bt12,R.id.bt13,R.id.bt14,R.id.bt15,R.id.bt16,R.id.bt17
};
private TextView textView;
private String expression="";
//判断运算是否结束
private boolean end=false;
//判断是否存在小数点
private boolean point=false;
//判断是否存在符号
private boolean operation=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for(int i=0;i<ids.length;i++){
buttons[i]=(Button)findViewById(ids[i]);
buttons[i].setOnClickListener(this);
}
textView=(TextView)findViewById(R.id.contentText);
}
//判断输入是否符合规范
public void onClick(View view){
//获取被点击按钮的id
int id =view.getId();
Button button =(Button)view.findViewById(id);
String current= button.getText().toString();
if(end){
expression="";
end=false;
point=false;
operation=false;
}
if(current.equals("清除")){
expression="0";
end=true;
point=false;
operation=false;
}
else if (current.equals("+")||current.equals("-")||current.equals("*")||current.equals("/")){
if(!operation){
//表达式为空,
if(expression.isEmpty()){
//输入为正负号,添加进表达式,但不改变符号状态
if (current.equals("-") || current.equals("+")) {
expression += current;
}
//输入为乘除号, 不执行操作
if (current.equals("*") || current.equals("/")) {
}
}
// 表达式不为空,且表达式最后位是数字
else if(expression.charAt(expression.length()-1)>='0'&&expression.charAt(expression.length()-1)<='9'){
expression+=current;
operation=true;
}
point=false;
}
else{ //已经存在运算符
//表达式最后一位是数字
if(expression.charAt(expression.length()-1)>='0'&&expression.charAt(expression.length()-1)<='9'){
double result= count();
if(result==Double.MAX_VALUE){
expression="错误";
}else{
//保留两位小数
result =(double)Math.round(result*100)/100;
expression=""+result;
expression+=current;
point=false;
}
}
}
}
else if(current.equals("=")){
//存在符号,且表达式最后一位是数字
if(operation&&expression.charAt(expression.length()-1)>='0'&&expression.charAt(expression.length()-1)<='9'){
double result= count();
if(result==Double.MAX_VALUE){
expression="错误";
}else{
//保留两位小数
result =(double)Math.round(result*100)/100;
expression=""+result;
end=true;
}
}
}
else if(current.equals(".")){
if(!point){
//如果表达式为空 或者表达式最后位不是数字, 输入. 默认加上0
if(expression.equals("")||(expression.charAt(expression.length()-1)<'0'||expression.charAt(expression.length()-1)>'9')){
expression+="0";
}
// 存在符号 同时表达式最后位不是数字
else if(operation&& (expression.charAt(expression.length()-1)<'0'||expression.charAt(expression.length()-1)>'9')){
expression+="0";
}
expression+=current;
point=true;
}
}
else{ //此时为数字
if(end){
expression="";
}
expression+=current;
}
textView.setText(expression);
}
private double count(){
double result=0;
double num1,num2;
String str1,str2;
int operateIndex=0;
char operate='0';
for(int i=0;i<expression.length();i++){
//找出表达式的运算符
if(expression.charAt(i)=='+'||expression.charAt(i)=='-'||expression.charAt(i)=='*'||expression.charAt(i)=='/'){
operateIndex=i;
operate=expression.charAt(i);
}
}
str1=expression.substring(0,operateIndex);
str2=expression.substring(operateIndex+1,expression.length());
num1=Double.parseDouble(str1);
num2=Double.parseDouble(str2);
if(operate=='+'){
result=num1+num2;
}
else if(operate=='-'){
result=num1-num2;
}
else if(operate=='*'){
result=num1*num2;
}
else if(operate=='/'){
if(num2==0){//返回最大值,作为判断错误的依据(待改进)
return Double.MAX_VALUE;
}
else{
result=num1/num2;
}
}
return result;
}
3.效果显示和实验心得
总结:android studio是我用过最难用的软件,会出现各种兼容性,且错误信息没有任何帮助,最后一直卡在图二的界面,等待虚拟机的响应。各种处理方式均无法解决,需要老师的指点。
本次实验是第一次设计一个安卓app,界面布局步骤较为简单,可以拖动控件的形式设置
个人认为较难的还是控件监听方面,第一次使用不太熟悉,敲代码速率慢。
本次实验了解到了开发一款软件最为简单的流程,以后多加学习!