Android studio實現(xiàn)簡單計算器
本文實例為大家分享了Android studio實現(xiàn)簡單計算器的具體代碼,供大家參考,具體內(nèi)容如下
需求分析
在Android studio中設(shè)計并實現(xiàn)一個簡單的計算器,實現(xiàn)連續(xù)的加減乘除運算。
界面設(shè)計
采用網(wǎng)格GridLayout布局,設(shè)計了一個6行4列的網(wǎng)格,最上邊是一個EditText用來顯示用戶輸入的運算數(shù)字和運算符,以及相關(guān)的運算結(jié)果,其占4列,文本框大小為50dip;依次往下的界面分別設(shè)置了數(shù)字和運算符以及操作的按鈕,各行各列的每個按鈕的大小均設(shè)為26sp。
編程分析
設(shè)計了兩個文件:1、控制文件MainActivity.java,完成按鈕的處理事件以及實現(xiàn)加減乘除及其結(jié)果輸出的功能,主要包括:顯示activity_main.xml定義的用戶界面;與用戶界面程序中的組件建立關(guān)聯(lián),并分別為每個組件注冊并實現(xiàn)監(jiān)聽接口;根據(jù)具體輸入和條件進行運算并顯示結(jié)果等。2、布局文件activity_main.xml,完成計算器界面的網(wǎng)格布局設(shè)計,包括了一個文本編輯框和18個按鈕。
具體進度
第1天:對簡單計算器進行系統(tǒng)的功能和界面分析,形成自己大致的設(shè)計想法,然后根據(jù)老師建議的書本程序以及自己上網(wǎng)搜索的安卓項目的編程,系統(tǒng)地總結(jié)出自己編程的過程以及開始理解各類代碼。由于對移動編程這門課還不是很熟悉,所以對其中編程部分的理解為自己往后調(diào)試程序有很大的幫助。
第2天:開始敲代碼。由于第一次在Android studio上面編程,對這個軟件的各項操作都不熟悉,所以剛開始就在軟件摸索上面花費了較多的時間。由于此次設(shè)計的界面老師給了我們書本的模板,所以我選擇從簡單的布局文件的設(shè)計開始編程,一方面也方便自己熟悉Android studio。
第3天:開始根據(jù)自己的理解和想法開始設(shè)計并調(diào)試控制文件的程序。由于這部分設(shè)計到多種函數(shù)以及接口的設(shè)計以及實現(xiàn),運用的是java,由于對過去學的java語言有些遺忘了,而且現(xiàn)在還要涉及關(guān)于新知識.xml的結(jié)合,所以在這部分花的時間比較長。期間出現(xiàn)了較多的bug,雖然調(diào)試起來很吃力,但最終一點點把程序調(diào)試成功還是挺開心的。
第4天:原本以為程序調(diào)試成功就好了,但是沒想到最后在AVD的各種選擇和配置、調(diào)用問題上花了更多的時間和精力。由于第一次接觸Android studio,所以對其中很多配置都不了解,也是第一次聽說AVD,在最終運行這個計算器APP的時候在AVD的選擇和配置失敗上卡了較長時間,通過百度以及請教同學,一步步地終于把最后這一步做好了。至此便完成了自己第一個簡單APP的開發(fā)。
心得體會
這是我的第一個安卓項目開發(fā),這個計算器代碼的邏輯都比較簡單,然后其功能也很不完善,是一個比較粗糙的設(shè)計。即便如此,由于自己對Android studio應(yīng)用程序設(shè)計的知識掌握得也不是很好,編程能力也比較弱,所以還是花了比較多的時間去研究和體會。但是,也正因為期間遇到的很多困難和bug,在自己一點點去設(shè)法解決的過程中也對這門課程的理論知識以及相關(guān)操作都有了更清晰的了解,現(xiàn)在明白了其中和大致框架和原理,為往后深入的學習和編程做好多一點基礎(chǔ)鞏固。

控制文件MainActivity.java
package com.example.df.firstapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; //引用按鈕組件
import android.widget.EditText; //引用文本編輯框組件
import android.text.TextUtils; //TextUtils類用于處理字符串
//定義實現(xiàn)監(jiān)聽接口的類MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//聲明17個按鈕和一個文本編輯框
Button bt_num0,bt_num1,bt_num2,bt_num3,bt_num4,bt_num5,bt_num6,bt_num7,
bt_num8,bt_num9,bt_delete,bt_div,bt_mult,bt_minus,bt_plus,bt_equal,bt_dot,bt_clear;
private EditText et_calc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //顯示activity_main.xml定義的用戶界面
initViewAndListener(); //調(diào)用函數(shù)initViewAndListener()
}
//定義函數(shù)initViewAndListener(),用于與用戶界面程序中的組件建立關(guān)聯(lián),并分別注冊監(jiān)聽接口
private void initViewAndListener() {
bt_num0 = (Button)findViewById(R.id.bt_num0);
bt_num0.setOnClickListener(this);
bt_num1 = (Button)findViewById(R.id.bt_num1);
bt_num1.setOnClickListener(this);
bt_num2 =(Button) findViewById(R.id.bt_num2);
bt_num2.setOnClickListener(this);
bt_num3 = (Button)findViewById(R.id.bt_num3);
bt_num3.setOnClickListener(this);
bt_num4 = (Button)findViewById(R.id.bt_num4);
bt_num4.setOnClickListener(this);
bt_num5 = (Button)findViewById(R.id.bt_num5);
bt_num5.setOnClickListener(this);
bt_num6 = (Button)findViewById(R.id.bt_num6);
bt_num6.setOnClickListener(this);
bt_num7 = (Button)findViewById(R.id.bt_num7);
bt_num7.setOnClickListener(this);
bt_num8 = (Button)findViewById(R.id.bt_num8);
bt_num8.setOnClickListener(this);
bt_num9 = (Button)findViewById(R.id.bt_num9);
bt_num9.setOnClickListener(this);
bt_delete = (Button)findViewById(R.id.bt_delete);
bt_delete.setOnClickListener(this);
bt_div = (Button)findViewById(R.id.bt_div);
bt_div.setOnClickListener(this);
bt_mult = (Button)findViewById(R.id.bt_mult);
bt_mult.setOnClickListener(this);
bt_minus = (Button)findViewById(R.id.bt_minus);
bt_minus.setOnClickListener(this);
bt_plus = (Button)findViewById(R.id.bt_plus);
bt_plus.setOnClickListener(this);
bt_equal = (Button)findViewById(R.id.bt_equal);
bt_equal.setOnClickListener(this);
et_calc = (EditText)findViewById(R.id.et_calc);
bt_dot = (Button)findViewById(R.id.bt_dot);
bt_dot.setOnClickListener(this);
bt_clear = (Button)findViewById(R.id.bt_clear);
bt_clear.setOnClickListener(this);
}
private boolean lastIsOperator; //記錄當前是否進行計算操作
private String lastOperators = ""; //記錄上一次進行計算操作的結(jié)果
private double firstNumber = 0D; //定義并初始化第一次的取值
private double sencondNumber = 0D; //定義并初始化第二次的取值
//onClick()方法,觸發(fā)OnClickListener接口
public void onClick(View v) {
String currentText = et_calc.getText().toString(); //獲取當前文本編輯框的內(nèi)容
String operatorNumber = ""; //定義并初始化操作數(shù)為””
if (currentText.equals("0")) { //若當前輸入數(shù)為0則設(shè)置文本編輯框為””
et_calc.setText("");
}
operatorNumber = et_calc.getText().toString(); //根據(jù)編輯框的內(nèi)容更改操作數(shù)值
if(!lastOperators.equals("")) //判斷上一次操作的數(shù)是否為空,非空則建立索引,隨之修改當前操作數(shù)
{
int index = operatorNumber.lastIndexOf(lastOperators);
operatorNumber = operatorNumber.substring(index+1);
}
//分別獲取按鈕的內(nèi)容至文本編輯框
switch (v.getId()) {
case R.id.bt_num0:
et_calc.setText(et_calc.getText() + "0");
lastIsOperator = false;
break;
case R.id.bt_num1:
et_calc.setText(et_calc.getText() + "1");
lastIsOperator = false;
break;
case R.id.bt_num2:
et_calc.setText(et_calc.getText() + "2");
lastIsOperator = false;
break;
case R.id.bt_num3:
et_calc.setText(et_calc.getText() + "3");
lastIsOperator = false;
break;
case R.id.bt_num4:
et_calc.setText(et_calc.getText() + "4");
lastIsOperator = false;
break;
case R.id.bt_num5:
et_calc.setText(et_calc.getText() + "5");
lastIsOperator = false;
break;
case R.id.bt_num6:
et_calc.setText(et_calc.getText() + "6");
lastIsOperator = false;
break;
case R.id.bt_num7:
et_calc.setText(et_calc.getText() + "7");
lastIsOperator = false;
break;
case R.id.bt_num8:
et_calc.setText(et_calc.getText() + "8");
lastIsOperator = false;
break;
case R.id.bt_num9:
et_calc.setText(et_calc.getText() + "9");
lastIsOperator = false;
break;
case R.id.bt_dot:
et_calc.setText(et_calc.getText() + ".");
lastIsOperator = false;
break;
//歸零按鈕,將當前操作數(shù)直接清零
case R.id.bt_clear:
et_calc.setText("");
lastIsOperator = false;
firstNumber=0D;
sencondNumber=0D;
lastOperators="=";
break;
//清除按鈕,若當前文本編輯框內(nèi)容為空,點擊一次則刪除一個字符串
case R.id.bt_delete:
if (TextUtils.isEmpty(et_calc.getText())) {
return;
}
lastIsOperator = false;
et_calc.setText(currentText.substring(0, currentText.length() - 1).length() > 0 ? currentText.substring(0, currentText.length() - 1) : "0");
break;
//計算按鈕,若當前內(nèi)容非空、或者以及上一次有操作記錄且記錄不是”=”的情況下,將當前的操作記錄設(shè)置為+、-、*、/、=
case R.id.bt_div:
if ((TextUtils.isEmpty(et_calc.getText())
|| lastIsOperator) && !lastOperators.equals("=")) {
return;
}
opratorCalc(operatorNumber,"÷");
lastIsOperator = true;
et_calc.setText(et_calc.getText() + "÷");
lastOperators = "÷";
break;
case R.id.bt_mult:
if ((TextUtils.isEmpty(et_calc.getText())
|| lastIsOperator) && !lastOperators.equals("=")) {
return;
}
opratorCalc(operatorNumber,"*");
lastIsOperator = true;
et_calc.setText(et_calc.getText() + "*");
lastOperators = "*";
break;
case R.id.bt_minus:
if ((TextUtils.isEmpty(et_calc.getText())
|| lastIsOperator) && !lastOperators.equals("=")) {
return;
}
opratorCalc(operatorNumber,"-");
lastIsOperator = true;
et_calc.setText(et_calc.getText() + "-");
lastOperators = "-";
break;
case R.id.bt_plus:
if ((TextUtils.isEmpty(et_calc.getText())
|| lastIsOperator) && !lastOperators.equals("=")) {
return;
}
opratorCalc(operatorNumber,"+");
lastIsOperator = true;
et_calc.setText(et_calc.getText() + "+");
lastOperators = "+";
break;
case R.id.bt_equal:
double result = 0D;
if(TextUtils.isEmpty(lastOperators))
{
return;
}
opratorResult(operatorNumber);
sencondNumber = 0D;
lastOperators ="=";
lastIsOperator = true;
et_calc.setText(et_calc.getText() + "\n=" + String.valueOf(firstNumber));
break;
}
}
//運算函數(shù),按具體操作進行+、-、*、/的運算
private void operate(String operatorNumber)
{
if(sencondNumber != 0D) //計算情況一:第二次輸入的數(shù)不為0
{
if(lastOperators.equals("÷"))
{
sencondNumber = sencondNumber / Double.parseDouble(operatorNumber);
firstNumber = firstNumber / sencondNumber;
}
else if(lastOperators.equals("*"))
{
sencondNumber = sencondNumber * Double.parseDouble(operatorNumber);
firstNumber = firstNumber * sencondNumber;
}
else if(lastOperators.equals("+"))
{
sencondNumber = Double.parseDouble(operatorNumber);
firstNumber = firstNumber + sencondNumber;
}
else if(lastOperators.equals("-"))
{
sencondNumber = Double.parseDouble(operatorNumber);
firstNumber = firstNumber - sencondNumber;
}
}
Else //計算情況二:第二次輸入的數(shù)為0
{
if(lastOperators.equals("÷"))
{
firstNumber = firstNumber / Double.parseDouble(operatorNumber);
}
else if(lastOperators.equals("*"))
{
firstNumber = firstNumber * Double.parseDouble(operatorNumber);
}
else if(lastOperators.equals("+"))
{
firstNumber = firstNumber + Double.parseDouble(operatorNumber);
}
else if(lastOperators.equals("-"))
{
firstNumber= firstNumber - Double.parseDouble(operatorNumber);
}
}
}
//分別返回計算結(jié)果
public void opratorResult(String operatorNumber)
{
operate(operatorNumber);
}
//按當前計算結(jié)果進行下一次的數(shù)據(jù)輸入及計算
public void opratorCalc(String operatorNumber,String currentOprator)
{
if(TextUtils.isEmpty(lastOperators))
{
firstNumber = Double.parseDouble(operatorNumber);
return;
}
if(lastOperators.equals(currentOprator))
{
if(lastOperators.equals("÷"))
{
firstNumber = firstNumber / Double.parseDouble(operatorNumber);
}
else if(lastOperators.equals("*"))
{
firstNumber = firstNumber * Double.parseDouble(operatorNumber);
}
else if(lastOperators.equals("+"))
{
firstNumber = firstNumber + Double.parseDouble(operatorNumber);
}
else if(lastOperators.equals("-"))
{
firstNumber = firstNumber - Double.parseDouble(operatorNumber);
}
return;
}
operate(operatorNumber);
}
}
布局文件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="wrap_content" android:columnCount="4" //設(shè)置了一個4列6行的網(wǎng)格 android:rowCount="6" tools:context=".MainActivity"> <EditText android:id="@+id/et_calc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_columnSpan="4" //該組件占據(jù)4列的位置 android:layout_marginLeft="4px" android:gravity="left" android:layout_row="0" android:background="#eee" android:textSize="50dip"/> <Button android:id="@+id/bt_delete" android:layout_column="3" android:layout_row="1" android:text="清除" android:textSize="26sp"/> <Button android:id="@+id/bt_clear" android:layout_column="0" android:layout_row="1" android:text="歸零" android:textSize="26sp"/> <Button android:id="@+id/bt_num1" android:layout_column="0" android:layout_row="2" android:text="1" android:textSize="26sp"/> <Button android:id="@+id/bt_num2" android:layout_column="1" android:layout_row="2" android:text="2" android:textSize="26sp"/> <Button android:id="@+id/bt_num3" android:layout_column="2" android:layout_row="2" android:text="3" android:textSize="26sp"/> <Button android:id="@+id/bt_plus" android:layout_column="3" android:layout_row="2" android:text="+" android:textSize="26sp"/> <Button android:id="@+id/bt_num4" android:layout_column="0" android:layout_row="3" android:text="4" android:textSize="26sp" /> <Button android:id="@+id/bt_num5" android:layout_column="1" android:layout_row="3" android:text="5" android:textSize="26sp"/> <Button android:id="@+id/bt_num6" android:layout_column="2" android:layout_row="3" android:text="6" android:textSize="26sp"/> <Button android:id="@+id/bt_minus" android:layout_column="3" android:layout_row="3" android:text="-" android:textSize="26sp" /> <Button android:id="@+id/bt_num7" android:layout_column="0" android:layout_row="4" android:text="7" android:textSize="26sp"/> <Button android:id="@+id/bt_num8" android:layout_column="1" android:layout_row="4" android:text="8" android:textSize="26sp"/> <Button android:id="@+id/bt_num9" android:layout_column="2" android:layout_row="4" android:text="9" android:textSize="26sp" /> <Button android:id="@+id/bt_mult" android:layout_column="3" android:layout_row="4" android:text="*" android:textSize="26sp" /> <Button android:id="@+id/bt_dot" android:layout_column="0" android:layout_row="5" android:text="." android:textSize="26sp" /> <Button android:id="@+id/bt_num0" android:layout_column="1" android:layout_row="5" android:text="0" android:textSize="26sp" /> <Button android:id="@+id/bt_equal" android:layout_column="2" android:layout_row="5" android:text="=" android:textSize="26sp" /> <Button android:id="@+id/bt_div" android:layout_column="3" android:layout_row="5" android:text="/" android:textSize="26sp" /> </GridLayout>
關(guān)于計算器的精彩文章請查看《計算器專題》 ,更多精彩等你來發(fā)現(xiàn)!
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android Studio實現(xiàn)簡易計算器
- android studio實現(xiàn)計算器
- Android studio設(shè)計簡易計算器
- Android Studio實現(xiàn)簡易計算器(表格布局TableLayout)
- android studio實現(xiàn)簡單的計算器功能
- Android Studio實現(xiàn)簡單計算器APP
- Android Studio實現(xiàn)簡單計算器功能
- android studio實現(xiàn)簡單的計算器(無bug)
- Android studio實現(xiàn)簡單的計算器
- android?studio實現(xiàn)簡易的計算器
相關(guān)文章
Android編程實現(xiàn)自定義輸入法功能示例【輸入密碼時防止第三方竊取】
這篇文章主要介紹了Android編程實現(xiàn)自定義輸入法功能,可實習輸入密碼時防止第三方竊取的效果,結(jié)合實例形式詳細分析了Android布局、控件及輸入法相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
Android和JavaScript相互調(diào)用的方法
這篇文章主要介紹了Android和JavaScript相互調(diào)用的方法,實例分析了Android的WebView執(zhí)行JavaScript及JavaScript訪問Android的技巧,需要的朋友可以參考下2015-12-12
Android實現(xiàn)打開手機淘寶并自動識別淘寶口令彈出商品信息功能
最近項目經(jīng)理給我們安排一個活兒,基于Android開發(fā)實現(xiàn)打開手機淘寶,并自動識別淘口令,彈出商品信息,今天小編就抽空給大家分享下這個需求是怎么實現(xiàn)的,需要的朋友參考下吧2017-11-11

