Android基礎知識(簡單實例計算器)
在做這個計算器的時候,我認爲主要分爲兩部分:界面設計,功能實現。
(效果圖)
界面設計:
其實界面設計和功能實現是相互聯繫在一起的,我界面怎麼去設計,功能就要去怎麼實現。
1、控件:界面有19個按鈕,數字1-9和小數點、加減乘除、清空回退、百分比、等號,還有一個顯示內容的文本框。實現起來十分簡單隻要拖動到xml中即可。
2、佈局設計:剛拖進來的控件都擺放得比較凌亂,需要對其調整,本案例中,我會使用LinearLayout對界面進行佈局。
3、樣式:有背景顏色、邊框線顏色、圓角。
接下來先看樣式文件:
簡單說明一下:
- gradient -- 對應顏色漸變。 startcolor、endcolor就不多說了。android:angle 是指從哪個角度開始變。
- solid -- 填充。
- stroke -- 描邊。
- corners -- 圓角。
- padding -- 定義內容離邊界的距離。 與android:padding_left、android:padding_right這些是一個道理。
先介紹white_bg.xml,也就是顯示內容的文本框的樣式文件:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--圓角-->
<corners android:radius="5dp" />
<!--邊框線-->
<stroke
android:width="1dp"
android:color="#000" />
<!--填充-->
<solid android:color="#FFF" />
</shape>
接下來介紹白色鍵的樣式文件white_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<pre name="code" class="html"> <item android:drawable="@drawable/white_bg" />
<item android:drawable="@drawable/gray_bg" android:state_pressed="true" />
</selector>
第一個item是調用上一個樣式white_bg.xm爲默認情況下的樣式第二個item是調用了gray_bg.xml樣式文件,根據其android:state_pressed="true"屬性,意爲點擊時的樣式。
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="5dp" />
<solid android:color="#ccc" />
</shape>
接下來介紹白色鍵的樣式文件orange_selector.xml:
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ashen" android:state_pressed="true" />
<item android:drawable="@drawable/orange_bg" />
</selector>
第一個item是調用了ashen.xml樣式文件,根據其android:state_pressed="true"屬性,意爲點擊時的樣式。
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="5dp" />
<solid android:color="#F5F5F5" />
</shape>
第二個item是調用樣式orange_bg.xm爲默認情況下的樣式:
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="5dp" />
<solid android:color="#FF6100" />
</shape>
在activity_main.xml的空間中分別去調用 white_bg、white_selector、orange_selector
功能實現:
在實現功能前,先要分清楚他們之間的關係:
1、數字0-9和小數點
2、加減乘除
3、清除與回刪鍵
4、等號
5、百分比
public class MainActivity extends Activity implements View.OnClickListener {
Button btn_0, btn_1, btn_2, btn_3, btn_4, btn_5, btn_6, btn_7, btn_8, btn_9; //數字0-9
Button btn_dian; //小數點
Button btn_C, btn_del; //清除和回刪
Button btn_yu; //求餘
Button btn_chu; //除法
Button btn_cheng; //乘法
Button btn_jia; //加法
Button btn_jian; //減法
Button btn_deng; //等於
EditText input;//顯示內容文本框
boolean clear_ed; //是否情況文本框
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_C = (Button) findViewById(R.id.btn_C);
btn_del = (Button) findViewById(R.id.btn_del);
btn_yu = (Button) findViewById(R.id.btn_yu);
btn_chu = (Button) findViewById(R.id.btn_chu);
btn_cheng = (Button) findViewById(R.id.btn_cheng);
btn_jia = (Button) findViewById(R.id.btn_jia);
btn_jian = (Button) findViewById(R.id.btn_jian);
btn_deng = (Button) findViewById(R.id.btn_deng);
btn_dian = (Button) findViewById(R.id.btn_dian);
btn_9 = (Button) findViewById(R.id.btn_9);
btn_8 = (Button) findViewById(R.id.btn_8);
btn_7 = (Button) findViewById(R.id.btn_7);
btn_6 = (Button) findViewById(R.id.btn_6);
btn_5 = (Button) findViewById(R.id.btn_5);
btn_4 = (Button) findViewById(R.id.btn_4);
btn_3 = (Button) findViewById(R.id.btn_3);
btn_2 = (Button) findViewById(R.id.btn_2);
btn_1 = (Button) findViewById(R.id.btn_1);
btn_0 = (Button) findViewById(R.id.btn_0);
input = (EditText) findViewById(R.id.input);
btn_0.setOnClickListener(this);
btn_1.setOnClickListener(this);
btn_2.setOnClickListener(this);
btn_3.setOnClickListener(this);
btn_4.setOnClickListener(this);
btn_5.setOnClickListener(this);
btn_6.setOnClickListener(this);
btn_7.setOnClickListener(this);
btn_8.setOnClickListener(this);
btn_9.setOnClickListener(this);
btn_yu.setOnClickListener(this);
btn_chu.setOnClickListener(this);
btn_cheng.setOnClickListener(this);
btn_jia.setOnClickListener(this);
btn_jian.setOnClickListener(this);
btn_deng.setOnClickListener(this);
btn_dian.setOnClickListener(this);
btn_C.setOnClickListener(this);
btn_del.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String str = input.getText().toString();
if (str.equals("0")) {
str = "";
}
switch (v.getId()) {
case R.id.btn_0:
case R.id.btn_1:
case R.id.btn_2:
case R.id.btn_3:
case R.id.btn_4:
case R.id.btn_5:
case R.id.btn_6:
case R.id.btn_7:
case R.id.btn_8:
case R.id.btn_9:
case R.id.btn_dian:
if (clear_ed) {
clear_ed = false;
str = "";
input.setText("0"); //重置爲0
}
input.setText(str + ((Button) v).getText()); //根據按鈕的setText來添加數字
break;
case R.id.btn_jia:
case R.id.btn_jian:
case R.id.btn_cheng:
case R.id.btn_chu:
input.setText(str + " " + ((Button) v).getText() + " "); //爲區分加減乘除和數字 特意留了空格爲間隔,
break;
case R.id.btn_C:
input.setText("0"); //重置爲0
break;
case R.id.btn_del:
if (input.length() <= 1 || input.getText().toString().equals("")) {
input.setText("0");
} else {
input.setText(str.substring(0, str.length() - 1)); // 刪除末尾一個數 由0開始 到str長度減1.
}
break;
case R.id.btn_deng:
getResult();
break;
case R.id.btn_yu:
Double d3 = Double.parseDouble(str);
Double d4 = d3 * 0.01;
input.setText(d4 + "");
break;
}
}
private void getResult() {
String exp = input.getText().toString();
if (exp == null || exp.equals("")) { //如果exp爲空的話結束
return;
}
if (!exp.contains(" ")) {//如果exp沒有爲預算法預留的“空格”的話結束
return;
}
clear_ed = true;
double result = 0;
String s1 = exp.substring(0, exp.indexOf(" ")); //定義s1的內容是 運算符前的那串數字
String op = exp.substring(exp.indexOf(" ") + 1, exp.indexOf(" ") + 2);//運算符
String s2 = exp.substring(exp.indexOf(" ") + 3); //定義s2的內容是 運算符前的那串數字
System.out.println(s1);
System.out.println(op);
System.out.println(s2);
if (!s1.equals("") && !s2.equals("")) { //分四種情況來寫,s1 s2都不爲null。s1 爲null,s2不爲。s1不爲,s2爲空。s12都爲空的
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,那麼結果爲0
result = 0;
} else {
result = d1 / d2;
}
}
//將算好了的結果,再根據是否包含小數點來 決定輸出的結果類型:整型還是雙精度型
if (!s1.contains(".") && !s2.contains(".")) { //如果s1、s2都不包含小數點,那麼他們是整型
int r = (int) result; //轉化爲int型
input.setText(r + "");
} else {
input.setText(result + "");
}
} else if (!s1.equals("") && s2.equals("")) { //如果s1不爲空,s2爲空
input.setText(exp); //結果不作處理,原樣輸出
} else if (s1.equals("") && s2.equals("")) { //都爲空
input.setText(exp); //結果不作處理,原樣輸出
} else if (s1.equals("") && !s2.equals("")) { //如果s1爲空,s2不爲空
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 (!s2.contains(".")) { //如果s1、s2都不包含小數點,那麼他們是整型
int r = (int) result; //轉化爲int型
input.setText(r + "");
} else {
input.setText(result + "");
}
}
}
}
後期再添加些註釋,先偷會懶。