Android小程式-簡易計算器的實現
阿新 • • 發佈:2019-01-04
目標效果:
通過編寫程式碼,可以實現整數和小數的加減乘除運算,以及刪除和清空的功能。
1.頁面中Button使用的是線性佈局,最外邊一個是父佈局,第一行C,DEL,/,*為第一個子佈局,第二行7,8,9,-為第二個子佈局,第三行4,5,6,+為第三個子佈局,第四五行為第四個子佈局,第四個子佈局中還有兩個相當於是孫佈局的級別,1,2,3為第一個孫佈局,0和.為第二個孫佈局,=在兩個孫佈局之外第四個子佈局以內。因為計算器的水平豎直排列十分鮮明,所以可以用線性佈局,當然也可以用表格佈局來進行排布。
2.activity_main.xml頁面用於存放所有控制元件。
activity_main.xml頁面:
2.等號按鈕和其餘按鈕的背景及點選效果不同。orange_select.xml頁面是等號按鈕的背景頁面。 orange_select.xml頁面:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_marginTop="40dp" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/etInput" android:layout_width="310dp" android:layout_height="60dip" android:editable="false" //代表不能進行鍵盤輸入 android:gravity="right" //文字靠右邊 android:layout_gravity="center" android:background="@drawable/white_bg"/> <!-- 設定輸入框的背景,為一個xml檔案 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_horizontal" android:orientation="horizontal" > <!-- 代表水平排布 --> <Button android:id="@+id/btClear" android:background="@drawable/white_select" //設定按鈕的背景,為一個xml檔案 android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="C" /> <Button android:id="@+id/btDel" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="DEL" /> <Button android:id="@+id/btDivide" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="/" /> <Button android:id="@+id/btMul" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="*" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_horizontal" android:orientation="horizontal" > <Button android:id="@+id/btSeven" android:background="@drawable/white_select" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="7" /> <Button android:id="@+id/btEight" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="8" /> <Button android:id="@+id/btNine" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="9" /> <Button android:id="@+id/btJian" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="-" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_horizontal" android:orientation="horizontal" > <Button android:id="@+id/btFour" android:background="@drawable/white_select" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="4" /> <Button android:id="@+id/btFive" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="5" /> <Button android:id="@+id/btSix" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="6" /> <Button android:id="@+id/btJia" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="+" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center_horizontal" android:orientation="horizontal" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btOne" android:background="@drawable/white_select" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="1" /> <Button android:id="@+id/btTwo" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="2" /> <Button android:id="@+id/btThree" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="3" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal" > <Button android:id="@+id/btZero" android:background="@drawable/white_select" android:layout_width="155dp" android:layout_height="60dp" android:textSize="20sp" android:text="0" /> <Button android:id="@+id/btPoint" android:background="@drawable/white_select" android:layout_marginLeft="5dp" android:layout_width="75dp" android:layout_height="60dp" android:textSize="20sp" android:text="." /> </LinearLayout> </LinearLayout> <Button android:layout_width="75dp" android:background="@drawable/orange_select" android:layout_height="125dp" android:text="=" android:layout_marginLeft="5dp" android:textSize="20sp" android:gravity="center" android:id="@+id/btEqu"> </Button> </LinearLayout> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/orange_bg" android:state_pressed="false"></item> <!-- 不點選時背景為orange_bg.xml頁面的效果 --> <item android:drawable="@drawable/khaki_bg" android:state_pressed="true"></item> <!-- 點選時背景為khaki_bg.xml頁面的效果 --> </selector>
3.orange_bg.xml頁面:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners android:radius="5dp"/>
<solid android:color="#ff9900"/>
</shape>
4.khaki.xml頁面:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners android:radius="5dp"/>
<solid android:color="#cc6600"/>
</shape>
5.white_select.xml頁面是其餘按鈕的背景頁面。 white_select頁面:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/white_bg" android:state_pressed="false"></item>
<item android:drawable="@drawable/gray_bg" android:state_pressed="true"></item>
</selector>
6.white_bg.xml頁面:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners android:radius="5dp"/>
<solid android:color="#ffffff"/>
</shape>
7.gray_bg.xml頁面:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners android:radius="5dp"/>
<solid android:color="#cccccc"/>
</shape>
8.MainActivity.java處理按鈕的點選事件以及數值運算。 MainActivity.java頁面:
package com.example.jisuanqi;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity implements OnClickListener{
private EditText etInput; //例項輸入框
private Button btOne; //例項所有按鈕
private Button btTwo;
private Button btThree;
private Button btFour;
private Button btFive;
private Button btSix;
private Button btSeven;
private Button btEight;
private Button btNine;
private Button btZero;
private Button btPoint;
private Button btJia;
private Button btJian;
private Button btMul;
private Button btDivide;
private Button btEqu;
private Button btClear;
private Button btDel;
boolean clear_flag; //清空標識,當用戶點選等號完成一次運算時進行清空
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etInput=(EditText) findViewById(R.id.etInput); //獲取輸入框的id
btOne=(Button) findViewById(R.id.btOne); //獲取所有按鈕的id
btTwo=(Button) findViewById(R.id.btTwo);
btThree=(Button) findViewById(R.id.btThree);
btFour=(Button) findViewById(R.id.btFour);
btFive=(Button) findViewById(R.id.btFive);
btSix=(Button) findViewById(R.id.btSix);
btSeven=(Button) findViewById(R.id.btSeven);
btEight=(Button) findViewById(R.id.btEight);
btNine=(Button) findViewById(R.id.btNine);
btZero=(Button) findViewById(R.id.btZero);
btPoint=(Button) findViewById(R.id.btPoint);
btJia=(Button) findViewById(R.id.btJia);
btJian=(Button) findViewById(R.id.btJian);
btMul=(Button) findViewById(R.id.btMul);
btDivide=(Button) findViewById(R.id.btDivide);
btEqu=(Button) findViewById(R.id.btEqu);
btClear=(Button) findViewById(R.id.btClear);
btDel=(Button) findViewById(R.id.btDel);
btOne.setOnClickListener(this); //設定點選事件,因為MainActivity已經實現了OnClickListener介面,所以只需要引數只需要傳this
btTwo.setOnClickListener(this);
btThree.setOnClickListener(this);
btFour.setOnClickListener(this);
btFive.setOnClickListener(this);
btSix.setOnClickListener(this);
btSeven.setOnClickListener(this);
btEight.setOnClickListener(this);
btNine.setOnClickListener(this);
btZero.setOnClickListener(this);
btPoint.setOnClickListener(this);
btJia.setOnClickListener(this);
btJian.setOnClickListener(this);
btMul.setOnClickListener(this);
btDivide.setOnClickListener(this);
btEqu.setOnClickListener(this);
btClear.setOnClickListener(this);
btDel.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String etinput=etInput.getText().toString(); //獲取輸入框中的內容並轉化為String型別
switch(v.getId()){ //判斷點選按鈕的id
case R.id.btZero:
case R.id.btOne:
case R.id.btTwo:
case R.id.btThree:
case R.id.btFour:
case R.id.btFive:
case R.id.btSix:
case R.id.btSeven:
case R.id.btEight:
case R.id.btNine:
case R.id.btPoint:
if(clear_flag){
clear_flag=false;
etinput="";
etInput.setText("");
}
etInput.setText(etinput+((Button)v).getText()); //點選數字和小數點直接顯示內容
break;
case R.id.btJia:
case R.id.btJian:
case R.id.btMul:
case R.id.btDivide:
if(clear_flag){
clear_flag=false;
etinput="";
etInput.setText(""); //當clear_flag為true時進入if語句,並可以清空,代表使用者點選了等於號完成一次運算,並使clear_flag變成了true
}
etInput.setText(etinput+" "+((Button)v).getText()+" "); //點選運算子也是直接顯示,但是為了後邊運算要在運算子兩側加上空格
break;
case R.id.btDel:
if(clear_flag){
clear_flag=false;
etinput="";
etInput.setText("");
}else if(etinput!=null&&!etinput.equals("")){
etInput.setText(etinput.substring(0,etinput.length()-1)); //如果輸入框內容不為空,則去掉最後一位
}
break;
case R.id.btClear:
clear_flag=false;
etinput="";
etInput.setText(""); //直接設定輸入框為空
break;
case R.id.btEqu:
getResult(); //點選等號呼叫getResult()方法
break;
}
}
public void getResult(){
String exp=etInput.getText().toString(); //獲取輸入框的內容
if(exp==null||exp.equals("")){
return;
}
if(!exp.contains(" ")){ //判斷輸入框是否包含空格,也就是沒有點選運算子
return;
}
if(clear_flag){ //點選等號clear_flag為true,當再點選別的數字或運算子時才會變為false,如果連續點選等號,則第二次點選無效,直接返回
clear_flag=false;
return;
}
clear_flag=true;
double result=0;
String s1=exp.substring(0,exp.indexOf(" ")); //運算子前面的字串
String op=exp.substring(exp.indexOf(" ")+1,exp.indexOf(" ")+2); //運算子,是根據運算子前邊的空格計算的
String s2=exp.substring(exp.indexOf(" ")+3); //運算子後邊的字串
if(!s1.equals("")&&!s2.equals("")){
double d1=Double.parseDouble(s1); //將字串轉換為double型別
double d2=Double.parseDouble(s2);
if(op.equals("+")){
result=d1+d2;
}else if(op.equals("-")){
result=d1-d2;
}else if(op.equals("*")){
result=d1*d2;
}else if(op.equals("/")){
if(d2==0){ //判斷除數為0的情況
result=0;
}else{
result=d1/d2;
}
}
if(!s1.contains(".")&&!s2.contains(".")&&!op.equals("/")){ //如果兩個數都是整形,那麼結果就需要顯示為整數
int r=(int)result; //將String型計算結果強制轉換為整形
etInput.setText(r+"");
}else{
etInput.setText(result+"");
}
}else if(!s1.equals("")&&s2.equals("")){ //如果使用者輸入一個數字就點選運算子,那麼將不計算
etInput.setText(exp);
}else if(s1.equals("")&&!s2.equals("")){ //如果一上來就點選運算子並輸入第二個數,那麼第一個數預設為0
double d2=Double.parseDouble(s2);
if(op.equals("+")){
result=0+d2;
}else if(op.equals("-")){
result=0-d2;
}else if(op.equals("*")){
result=0;
}else if(op.equals("/")){
result=0;
}
if(!s1.contains(".")&&!s2.contains(".")&&!op.equals("/")){
int r=(int)result;
etInput.setText(r+"");
}else{
etInput.setText(result+"");
}
}else{
etInput.setText("");
}
}
}
9.程式完成就可以運行了。因為是簡易計算器,所以還不能進行連續的加減乘除。