從簡易計算器學習Android開發
阿新 • • 發佈:2018-12-16
初學Android移動開發,先從一個簡單的專案開始——簡易計算器。
前言:
如果你在Android studio配置方面有什麼錯誤,可以參考我的其他部落格。這裡只是寫一下我作為一個初學者的開發筆記,總結自己的得失,為以後的開發打基礎。對你有幫助的地方請自取。
目錄
開發過程中的筆記:
- 關於.xml
- 在開發一個專案的時候,首先要設計好 *.xml 介面的佈局顯示:*.xml介面總體佈局結構使用到的有TableLayout(表格佈局)、LinearLayout(線性佈局)——分為垂直線性佈局(android:orientation="vertical")和水平線性佈局 (android:orientation="horizontal")。
- 在TableLayout(表格佈局)中,如果一行有多個控制元件,使用<TableRow>,把要放在一行的控制元件放在一個<TableRow>之中,可以自動實現對齊等效果。
- <TextView>標籤一般用於顯示的控制元件,不對其進行操作,執行之後也無法標籤裡邊的更改內容。而<EditText>則是允許輸入的輸入框,接收字串和整型數字等,在新版的Android studio中控制元件<EditText>不會自動適應長度,需要通過android:ems="10" 來改變長度。PS:有些控制元件在可拖拽的Palette的控制元件列表中無法找到,但可以使用。
- 需要獲取資料的控制元件,或者需要通過程式碼來控制顯示資訊的控制元件,需要給控制元件自定義id,android:id="@+id/StringName",在*Activity.java 的類中,定義變數,並在onCreate()中通過findViewById()方法來呼叫,例如
private EditText firstText; private EditText secondText; private TextView calculateTypeText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); firstText = (EditText) this.findViewById(R.id.firstNumber); secondText = (EditText)this.findViewById(R.id.secondNumber); calculateTypeText = (TextView) this.findViewById(R.id.calculateTypeText); }
- 關於*Activity.java
- 需要匯入引用的的import ,會在建立變數的時候自動新增引用。
- 需要的操作*.xml的變數,都要去定義,定義分為私有private、公有public、保護protected三種,按照需求自行定義。對於定義變數的賦值,即找到變得所對應的id,需要在onCreate()中通過方法實現。如上☝
- 每一種操作都要有一個方法監聽,比如點選事件,單選框改變事件等。新建一個事件之後要對這個事件的函式複寫,即事件的具體操作和執行。
- Intent 是一個用於各個介面之間資料交換和傳遞的類,Bundle也是一個用於個介面資料交換和傳遞的類。不同點舉個栗子:現在我要把值通過A經過B傳給C。如果用Intent的話 A到B先寫一遍, 再在B中都取出來 ,然後再把值放到Intent中 ,再跳到C,C才能收到資料。如果我在A中用了 Bundle 的話 ,我把Bundle傳給B ,在B中再轉傳到C, C就可以直接獲取到值。這樣的話 還有一個好處: 就是在B中 還可以給Bundle物件新增新的 key - value ,同樣可以在C中取出來。
程式碼目錄結構:
對於伸手黨,最難過的莫過於只有程式碼,沒有一個具體的大綱一樣的目錄結構。所以,習慣伸手的我,給習慣伸手的你一個便利。
原始碼:
MainActivity.java:
package com.felix.felix.pro_calculator;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
private EditText firstText;
private EditText secondText;
private TextView calculateTypeText;
private int firstNumber = 0;
private int secondNumber =0;
private Button chooseButton;
private Button calculateButton;
private int requestCode= 0;
private int calculationType= -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstText = (EditText) this.findViewById(R.id.firstNumber);
secondText = (EditText)this.findViewById(R.id.secondNumber);
calculateTypeText = (TextView) this.findViewById(R.id.calculateTypeText);
chooseButton =(Button)this.findViewById(R.id.chooseButton);
calculateButton=(Button)this.findViewById(R.id.calculateButton);
//定義一個點選事件,點選跳轉介面
chooseButton.setOnClickListener(new ChooseButtonListener());
calculateButton.setOnClickListener(new CalculateButtonListener());
}
//對於點選事件的類和函式複寫
class ChooseButtonListener implements View.OnClickListener{
@Override
public void onClick(View arg0) {
//跳轉介面的具體實現
Intent intent = new Intent(MainActivity.this,CalculationTypeActivity.class);
//帶著其它介面的資訊返回本介面。requestCode 是本介面的標識
MainActivity.this.startActivityForResult(intent,requestCode);
}
}
class CalculateButtonListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,ResultActivity.class);
intent.putExtra("firstNumber",firstText.getText().toString());
intent.putExtra("secondNumber",secondText.getText().toString());
//計算結果
intent.putExtra("calculationType",calculationType);
int result =0;
firstNumber = Integer.parseInt(firstText.getText().toString());
secondNumber = Integer.parseInt(secondText.getText().toString());
switch (calculationType){
case 1:
result = firstNumber + secondNumber;
break;
case 2:
result = firstNumber - secondNumber;
break;
case 3:
result = firstNumber * secondNumber;
break;
case 4:
result = firstNumber / secondNumber;
break;
default:
result = 1;
break;
}
//帶著這個介面的資訊去其他介面
intent.putExtra("result",result);
startActivity(intent);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(this.requestCode==requestCode&& CalculationTypeActivity.resultCode==resultCode){
Bundle bundle = data.getExtras();
calculationType = data.getIntExtra("type1",-1);
System.out.println("calculationType:" + calculationType);
calculateTypeText.setText(ConstantInfo.typeMap.get(calculationType));
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout 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"
>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="5dp"
android:textSize="14sp"
android:text="簡易計算器"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="第一個數:"
android:textSize="18dp" />
<EditText
android:id="@+id/firstNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:ems="10"
android:hint="請輸入第一個數"
android:inputType="number"
android:textSize="14sp" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:textSize="18dp"
android:text="第二個數:"
/>
<EditText
android:id="@+id/secondNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:ems="10"
android:hint="請輸入第二個數"
android:inputType="number"
android:textSize="14sp" />
</TableRow>
<TableRow>
<TextView
android:id="@+id/calculateType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:textSize="18dp"
android:text="計算型別:"
/>
<TextView
android:id="@+id/calculateTypeText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textSize="18dp"
android:text="未選擇計算型別"
/>
<Button
android:id = "@+id/chooseButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="-20dp"
android:text="選擇"
/>
</TableRow>
<TableRow>
<Button
android:id = "@+id/calculateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="計算"
/>
</TableRow>
</TableLayout>
CalculationTypeActivity.java
package com.felix.felix.pro_calculator;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
public class CalculationTypeActivity extends AppCompatActivity {
private RadioGroup group;
private RadioButton add;
private RadioButton minus;
private RadioButton multiply;
private RadioButton divider;
private Button okBtn;
private int calculationType = -1;
protected static final int resultCode = 0x321;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculation_type);
group = (RadioGroup)this.findViewById(R.id.group);
add = (RadioButton)this.findViewById(R.id.add);
minus = (RadioButton)this.findViewById(R.id.minus);
multiply = (RadioButton)this.findViewById(R.id.multiply);
divider = (RadioButton)this.findViewById(R.id.divider);
okBtn = (Button)this.findViewById(R.id.ok);
group.setOnCheckedChangeListener(new GroupSelectionListener());
okBtn.setOnClickListener(new okLstener());
}
class GroupSelectionListener implements RadioGroup.OnCheckedChangeListener{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//選擇的是哪一個按鈕
int radioButtonId = group.getCheckedRadioButtonId();
RadioButton btn = (RadioButton)CalculationTypeActivity.this.findViewById(radioButtonId);
//為啥不用switch?
if(btn.getId()==add.getId()){
calculationType=1;
}else if(btn.getId()==minus.getId()){
calculationType=2;
}else if(btn.getId()==multiply.getId()){
calculationType=3;
}else if(btn.getId()==divider.getId()){
calculationType=4;
}
System.out.println("current value:" + calculationType);
}
}
//處理點選時間按鈕,並且把資訊返回到MainActivity中
class okLstener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent = getIntent();
intent.putExtra("type1",calculationType);
Bundle bundle = new Bundle();
bundle.putInt("type",calculationType);
intent.putExtras(bundle);
//把這個activity的值回傳回去
CalculationTypeActivity.this.setResult(resultCode,intent);
//把這個介面消掉,讓MainActivity出現
CalculationTypeActivity.this.finish();
}
}
}
activity_calculation_type.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="請選擇計算型別:"
android:textSize="20dp" />
<RadioGroup
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="vertical"
>
<RadioButton
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加法"
android:textSize="20dp"
/>
<RadioButton
android:id="@+id/minus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="減法"
android:textSize="20dp"
/>
<RadioButton
android:id="@+id/multiply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="乘法"
android:textSize="20dp"
/>
<RadioButton
android:id="@+id/divider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="除法"
android:textSize="20dp"
/>
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="確定"
/>
</RadioGroup>
</LinearLayout>
ResultActivity.java
package com.felix.felix.pro_calculator;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class ResultActivity extends AppCompatActivity {
private TextView resultText;
private Button back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
resultText = (TextView)this.findViewById(R.id.resultText);
back = (Button)this.findViewById(R.id.back);
back.setOnClickListener(new BackListener());
Intent intent = this.getIntent();
StringBuilder builder = new StringBuilder();
builder.append(intent.getStringExtra("firstNumber"))
.append(" ")
.append(ConstantInfo.infoMap.get(intent.getIntExtra("calculationType",0)))
.append(" ")
.append(intent.getStringExtra("secondNumber"))
.append(" = ")
.append(intent.getIntExtra("result",-1));
//把結果存入resultText中
resultText.setText(builder.toString());
}
class BackListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent = new Intent(ResultActivity.this,MainActivity.class);
startActivity(intent);
ResultActivity.this.finish();
}
}
}
activity_result.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="計算結果"
android:textSize="20dp"
/>
<TextView
android:id="@+id/resultText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:textSize="20dp"
/>
<Button
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="返回"/>
</LinearLayout>
ConstantInfo.java
package com.felix.felix.pro_calculator;
import java.util.HashMap;
import java.util.Map;
/*
Created by Felix on 2018/11/28 21:01
*/
public class ConstantInfo {
public static final String add = "加法";
public static final String minus = "減法";
public static final String multiply = "乘法";
public static final String divider = "除法";
public static final Map<Integer,String> typeMap = new HashMap<Integer,String>();
public static final Map<Integer,String> infoMap = new HashMap<Integer,String>();
static {
typeMap.put(1,add);
typeMap.put(2,minus);
typeMap.put(3,multiply);
typeMap.put(4,divider);
infoMap.put(1,"+");
infoMap.put(2,"-");
infoMap.put(3,"*");
infoMap.put(4,"/");
}
}
轉載註明出處。
指教請聯絡:郵箱 [email protected] QQ:1311665691