這學期有安卓這門課,這裏作了一個簡易的計算器,實現了兩位數加減乘除的基本功能,比較簡單適合用來入門學習。android
實現這個計算器以前要先了解實現計算器須要的基本組件算法
1.TextViewapp
TextView是一個文本顯示組件,提供了基本的顯示文本功能,由於大多數UI系統組件都須要展現信息,全部它也是大多數UI系統組件的父類。ide
(1)TextView的經常使用屬性和方法函數
屬性名 | 對應方法 | 說明 |
---|---|---|
android:autoLink | setAutoLinkMask(int) | 設置是否當文本爲:URL連接、E-mail、電話號碼、Map時,文本顯示爲可單機的連接 |
android:gravity | setGravity(int) | 設置文本框的對應方式 |
android:layout_gravity | 設置組件自己相對於父組件的顯示位置 | |
android:lines | setLines(int) | 設置文本的行數,設置兩行就顯示兩行,即便第二行沒有數據 |
android:text | setText(CharSequence) | 設置文本框顯示的文本內容 |
android:textColor | setTextColor(int) | 設置文本顯示的顏色 |
android:textSize | setTextSize(float) | 設置文字大小,推薦度量單位"sp" |
android:textStyle | setTypeface(Typeface) | 設置字形:粗體、斜體等 |
android:layout_width | 設置文本框在屏幕上的寬度 | |
android:layout_height | 設置文本框在屏幕上的高度 |
(2)gravity和layout_gravity的屬性值及說明佈局
屬性值 | 說明 |
---|---|
top | 頂部對齊 |
bottom | 底部對齊 |
left | 左邊對齊 |
right | 右邊對齊 |
center_horizontal | 橫向中央位置對齊 |
2.Button學習
Button是TextView的子類,因此TextView上不少屬性也能夠直接應用到Button上。實際開發中對於Button操做主要是按下後執行何種操做。字體
(1)Button的經常使用屬性和方法this
屬性名 | 對應方法 | 說明 |
---|---|---|
android:clickable | setClickable(boolean) | 設置是否容許點擊按鈕(true/false) |
android:background | setBackgroudResource | 經過資源文件設置背景色 |
android:onClick | setOnClickListener(OnClickListener) | 設置點擊事件 |
(2)監聽事件設計
每個添加到UI上的Button通常都須要給它綁定監聽事件,給Button綁定監聽事件一般有兩類方法:
瞭解完了組件以後還要了解一個佈局,才能將組件更好的擺放在界面上。此計算器使用線性佈局實現的。
3.LinerLayout
線性佈局是Android應用程序開發時較爲常見的一種佈局類型,它能夠將用戶界面上的組件拜訪水平(horizontal)或垂直(vertical)的形式。
LinerLayout的經常使用屬性和對應方法
屬性名 | 對應方法 | 說明 |
---|---|---|
android:orientation | setOrientation(int) | 設置線性佈局的方向,有horizontal(水平)和vertical(垂直)兩個值,必須設置 |
android:layout_gravity | 設置組件自己相對於父組件的顯示位置 | |
android:divider | 設置分割線的圖片 | |
android:layout_weight | 設置權重,即讓一行或一列的組件按比例顯示 |
根據運行效果能夠看出,計算器主要實現了加、減、乘、除的計算功能。
採用嵌套的線性佈局
具體結構以下:
總體是一個垂直的線性佈局,最上面放置一個TextView,下面是五個水平的線性佈局用來放置按鈕。
按鈕的寬度是用weight權重設置而成,讓觀感更好。
最外層的線性佈局添加了屬性 android:layout_margin="8dp"
讓佈局與邊框有了8dp的間隔,也是使觀感更好。
this.findViewById(R.id.具體id)
進行實例化。數字按鍵的功能只是顯示到TextView中因此使用的是添加onClick屬性並指定方法綁定監聽事件,功能按鍵使用的是匿名內部類定義其功能。
(1)定義變量和初始化組件
private Button btnAdd, btnDec, btnMul, btnDev, btnEqu, btnClear, btnDel; private TextView txtResult; //顯示結果 private StringBuffer digtalA = new StringBuffer(),digtalB = new StringBuffer(); private boolean isChar = false; //是否爲運算符 private int operater = 0; // 判斷是哪一種運算符 0+ 1- 2* 3/ private boolean isDigtalA = true; void initView(){ txtResult = (TextView) this.findViewById(R.id.txtResults); btnAdd = (Button) this.findViewById(R.id.btnAdd); btnDec = (Button) this.findViewById(R.id.btnDec); btnMul = (Button) this.findViewById(R.id.btnMul); btnDev = (Button) this.findViewById(R.id.btnDev); btnEqu = (Button) this.findViewById(R.id.btnEqu); btnClear = (Button) this.findViewById(R.id.btnC); btnDel = (Button) this.findViewById(R.id.btnDel); }
(2)數字0~9及小數點的監聽事件定義了myOnclick()方法來實現
public void myOnclick(View v){ switch (v.getId()){ case R.id.btn0: setVal("0"); break; case R.id.btn1: setVal("1"); break; //...中間代碼省略 case R.id.btnDot: setVal("."); break; } }
setVal()方法是對重複代碼的抽取。
public void setVal(String s){ if (isChar){ digtalB.append(s); txtResult.setText(digtalB.toString()); }else{ digtalA.append(s); txtResult.setText(digtalA.toString()); } }
此代碼做用是判斷當前輸入的數字是運算的第一個數仍是第二個數。對其進行賦值(digtalA爲StringBuffer存儲第一個運算數,B存儲第二個運算數)並顯示到TextView中。
(3)運算法"+"的監聽事件
btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (digtalA.length() == 0){ return; } operater = 0; isChar = true; isDigtalA = false; txtResult.setText("+"); } });
減乘除與其相似。
(4)清空按鈕 "C" 的監聽事件
btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { digtalA = new StringBuffer(); digtalB = new StringBuffer(); isChar = false; isDigtalA = true; txtResult.setText("0"); } });
(5)等於號 "=" 的監聽事件
btnEqu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (digtalA.length() == 0 || digtalB.length() == 0){ return; } float a = Float.parseFloat(digtalA.toString()); float b = Float.parseFloat(digtalB.toString()); float c = 0; switch (operater){ case 0: c = a + b; break; case 1: c = a - b; break; case 2: c = a * b; break; case 3: c = a / b; break; } txtResult.setText(c+""); digtalA = new StringBuffer(); digtalB = new StringBuffer(); isChar = false; isDigtalA = true; } }); }
先判斷兩個運算數是否爲空,爲空直接返回,再進行相應的加減乘除操做,將結果顯示到屏幕中,並清空A,B及其餘標識符。
(6)退格刪除 "DEL" 的監聽事件
btnDel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isDigtalA){ if (digtalA.length() > 0){ String temp = digtalA.substring(0,digtalA.length()-1); digtalA = new StringBuffer(); digtalA.append(temp); txtResult.setText(digtalA.toString()); }else{ digtalA = new StringBuffer(); digtalA.append("0"); } }else{ if (digtalB.length() > 0){ String temp = digtalB.substring(0,digtalB.length()-1); digtalB = new StringBuffer(); digtalB.append(temp); txtResult.setText(digtalB.toString()); }else{ digtalB = new StringBuffer(); digtalB.append("0"); } } } });
isDigtalA 是用來判斷當前輸入數字是第一個運算數仍是第二個,退格用StringBuffer的substring截斷最後一位數字。
(7)其餘說明
單位 | 說明 |
---|---|
px(像素) | 至關於實際屏幕的像素,因爲不一樣屏幕的像素數差別比較大,所以這個單位不推薦用於尺寸單位 |
dp/dip(密度無關像素) | 一種與屏幕密度無關的尺寸單位,當屏幕密度是160dpi時,1dp=1px。當運行在高dpi的屏幕上時,dp就會按比例放大,當運行在低dpi的屏幕上時,dp就會按比例縮小。所以dp是一種簡單解決view在不一樣大小屏幕上顯示問題的解決方案 |
sp | 與dp類似,可是它會隨着用戶對系統字體大小的設置進行比例縮放,即它可以跟隨用戶系統字體大小變化。因此它更適合做爲字體大小的單位 |