2020 Android Develop 超新手文章系列 — “BMI Calculating APP”
By: Welsen Ho
Tags: Android Apps, Android, AndroidDev, Android Development, Android App Developers

2020 Android Develop 超新手文章系列 — “BMI Calculating APP”

如果你還在讀，恭喜你跨出了第二步。別擔心，我們還在蜜月期，所以你暫時不需要太擔心會不會碰到困難。

在開始之前，不要怕看不懂，如果有些段落看不懂，代表你很正常，你可以再看第二遍。

這篇文章將帶你製作一個可以計算BMI的APP，而文章編寫概念為單純介紹工具的使用方法以及工具的選擇。APP概念如下：

以下為我這次要教你的清單，Ready up

Section 1

元件（Component）的基礎使用 XML是什麼？ 以及你為何應該喜歡它？ BMI計算APP介面設計

Section 2

Coding 跟交男女朋友一樣，你以為很好搞？no no no熟了就不一樣了 Activity的那些事 Let’s start develop

SECTION 1

1.1 元件（Component）的基礎使用

什麼是Component？最簡單的方式來說明就是用來給使用者看或有互動的東西。舉凡說，當你面前有個控制台，且上面有一顆紅色的大按鈕，你是不是會有種想按的感覺？在這裡的紅色大按鈕就是我們所說的元件。

蛤？你說我講的不是很清楚。沒事，我現在就拿Facebook Login的畫面來給你示範

這是一個Facebook的登入畫面

當我們在看這一個登入畫面時，我們首先會先點第一個Email輸入，再點第二個Password輸入，在Android Studio裡，我們稱這2個元件為EditText。＃使用者跟這2個元件有互動關係。

當輸入好該輸入的資訊時，這時我們就會點選那顆大大的Login按鈕來進行登入的動作。在Android Studio裡，我們稱這個元件為Button。＃使用者跟這個元件有互動關係。

有沒有看到畫面裡上面有一張有很多手愛Facebook的畫面，這個圖片也是元件之一，在Android Studio裡，我們稱為ImageView。＃使用者跟這個元件可以有或沒有互動關係。

以上大概就是簡單的範例介紹，當然Android Studio的元件絕對不只這3個而已，你剛剛看到的Facebook登入畫面實際有更多的元件，這些元件促成這個畫面的成立。

而這些元件的擺放位置則是經過Facebook專業的設計團隊決定。經由不斷的使用者測試慢慢的雕琢，把APP的美感呈現出來，讓使用者能有更好的使用體驗。我們稱這些人為UI(User Interface)/UX(User Experience)設計。

好啦，講了這麼多的話，接來來也該開始做一些示範介紹了，讓我們開啟剛剛的“Hello Android”專案開始實作一些例子吧。

1.2 XML是什麼？ 以及你為何應該喜歡它？

XML的全名為extensible markup language（可延伸標記式語言），還記得在前面說過元件的擺放位置嗎？沒錯，XML就是為了設計元件擺放位置而存在的語言。除了位置以外，他還可以決定元件的風格，例如這個按鈕你要紅色還是藍色、決定按鈕上的字體大小或字型等等。其實不管是位置還風格，我們都統一稱這些為元件的Attributes（屬性），而XML就是用調整或控制各個元件屬性的語言。

看起來很複雜對不對？沒事，我等等就用行動讓你感受。

首先先把activity_main.xml這個檔案開啟，畫面如下（如果你畫面跟我不同也沒關係，只要確定是同個檔案就行了，圖中左邊的檔案樹我也顯示給你看檔案位置）

activity_main.xml的檔案

接下來請幫我按右上角有一個Split的按紐

右上角一個Split的按鈕

按下去後畫面應該會像這樣

我先介紹一下這個畫面，最左邊的為你的檔案樹，中間就是讓你編寫XML語言的編輯器，右邊則是當你修改XMl之後會立即預覽的畫面。還記得你剛剛點了Split按鈕嗎？他左右2邊還有各一個按鈕分別為Code和Design，這些按鈕能讓你決定你設計畫面的方法。如果你點Code的話，Android Studio會把預覽畫面關閉並顯示純XML編Code方法。而如果你點Design的話，Android Studio則會把XML編輯器關閉，並只顯示預覽畫面而已。在這裡我就不示範了，你可以自己玩玩看。

Tip：順便說一下，上方的畫面如果你覺得像左邊的檔案樹很礙眼的話，你可以點選檔案數上面的減號，它會把檔案樹隱藏起來，如果你還要再開啟的話，再點選一次Project就可以開啟，其他的視窗也有一樣的方便性。

好啦，接下來我們要實際寫寫看XML語言。我們現在看這個畫面上只有一個元件，他叫做TextView元件，在XML編輯視窗裡你會看到TextView的Code如下（我用粗體字標示）

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

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"

tools:context=".MainActivity">



<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello Android!"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"/>



</androidx.constraintlayout.widget.ConstraintLayout>

注意看一下這個TextView的寫法，上面第一行為

<TextView

而最後則是用下面個包起來

/>

這代表一個元件最基本的寫法，簡單來說就是元件要有始有終，因為這中間裡的Code就是Attributes的控制。假設現在畫面上有2個元件，如果沒有包起來的話，Android會無法辨識哪些屬性是控制哪個元件。當然，如果你沒有包起來的話，Android Studio會直接給你紅線（紅線沒解決之前，你是無法Play測試的），你可以試試看把/>刪掉，他會有紅線標出來，你在把滑鼠移到紅線上，它會顯示

Tag start is not close

你看到這段字，應該就會知道他在說什麼了吧。現在請按ctrl + z (mac電腦為 cmd + z)復原，跟Word一樣，你做了什麼不該做的，回復可以解決。

現在我們再回去TextView看一次，我們把text在改掉一次，改成”Hello XML”如下：

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

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"

tools:context=".MainActivity">



<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello XML!"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"/>



</androidx.constraintlayout.widget.ConstraintLayout>

這個Text的屬性就是可以改變他顯示的內容

有沒有感覺字體有點小？沒事，我們現在就來放大。請在text的下一行增加一個textSize的屬性，並把字體改變為24sp的大小，Code如下

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

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"

tools:context=".MainActivity">



<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello XML!"

android:textSize="24sp"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"/>



</androidx.constraintlayout.widget.ConstraintLayout>

現在再看一次隔壁預覽畫面字體是不是放大了，很好玩，對不對？

我們覺得這個畫面很無聊，想要新增一個Button按鈕元件，使用方式如下

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

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"

tools:context=".MainActivity">



<TextView

android:id="@+id/textView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello XML!"

android:textSize="24sp"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent" />



<Button

android:id="@+id/btnCLick"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Subscribe to medium/welsen ho"

android:textAllCaps="false"

android:textSize="18sp"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.62"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent"

app:layout_constraintVertical_bias="0.587" />





</androidx.constraintlayout.widget.ConstraintLayout>

把Button這段屬性複製貼上之後，你的預覽畫面就會多一個Button的按紐，現在你可以Play一次看看，用模擬機跑跑看這個APP，當然，你就算點選Button也不會有任何動作，那是因為我們還沒為這個Button增加程式邏輯。

現在到目前為止你可以知道如：textSize、text或textColor等等比較直覺性的名詞，其他如：

layout_width、layout_height或app:layout_constraintEnd_toEndOf等等比較抽象的物件屬性你可能還很模糊。沒關係，之後我會在寫一篇完整介紹這些屬性的文章。你目前只需要知道你可以用這些屬性(Properties)來控制一項物件(Object)

3 BMI計算APP介面設計

到目前為止，在讀過所有的東西之後，有沒有覺得更懂他的使用方式與意義了。如果有，那還真是太好了，接下來請你幫我把一下的XML複製到你的activity_main.xml裡吧。

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

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"

tools:context=".MainActivity">



<Button

android:id="@+id/btnCalculate"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="計算重量"

android:textAllCaps="false"

android:textSize="18sp"

android:layout_marginTop="20dp"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/txtResult"

android:layout_marginStart="20dp"

android:layout_marginEnd="20dp"/>



<EditText

android:id="@+id/editWeight"

android:layout_width="200dp"

android:layout_height="wrap_content"

android:layout_marginBottom="30dp"

android:hint="重量"

app:layout_constraintBottom_toTopOf="@+id/txtResult"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent" />



<EditText

android:id="@+id/editHeight"

android:layout_width="200dp"

android:layout_height="wrap_content"

android:layout_marginBottom="10dp"

android:hint="身高"

app:layout_constraintBottom_toTopOf="@+id/editWeight"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent" />



<TextView

android:id="@+id/txtResult"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="結果"

android:textSize="24sp"

android:textStyle="bold"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent" />





</androidx.constraintlayout.widget.ConstraintLayout>

在上面理我新增了2個新的物件，各為EditText的物件，這個物件主要是可以讓使用者輸入各自的體重與身高。你可以現在Play看看，等模擬器開好之後點EditText的框框，你就會知道我在說什麼了。

複製好之後你的預覽畫面應該會長這樣

你也許會想，我為什麼都不解釋並只讓你複製而已，那是因為這篇文章的目的並不是跟你細講各個Properties的運用，而是要讓你知道，控制這些物件的方法與意義。至於運用的方式會在之後的文章完整解釋。

到目前為止，我們都在設計的部分講了這麼多，但是你在實際執行App的時候，這些物件都不會有什麼反應，那是因為這些物件缺少了實際執行的邏輯，簡單來說就是你沒有跟它們說要做什麼。因此，在下一章節，我將介紹背後控制這些物件靈魂，也就是程式碼Code。

SECTION 2

2.1 Coding 跟交男女朋友一樣，你以為很好搞？no no no熟了就不一樣了

好啦，在剛剛講解完XML使用方式與意義之後，接下來要到我們Code的部分了。基本上，Code這個部分是要用來計算User輸入進來的資料，控制Component，並把資料顯示在頁面上。我會用以下這個清單來介紹等下我們會Code出哪些功能(Function)出來。

連接前端Component 按下按鈕時，讀取User輸入的資料 使用User給的資料計算相對應的BMI 控制Component把資料顯示出來

打Code要打的有意義，要知道你打出來的這一段Code目的是要幹什麼用，雖然不會跟你完全說明每一行的意義，但是會讓你知道你到底在幹三小。

好了，廢話不多說，開始寫Code吧。

等等，我開玩笑的，在寫Code之前要先讓你知道Activity這個東西的存在。

2.2 Activity的那些事

基本上下面這個就是Activity的檔案（我有開檔案樹，你可以看到它在哪裡），注意他的檔名是

MainActivity.java，點後面的Java代表這個Activity檔案是用Java語言寫的

MainActivity.java

那到底Activity是什麼呢？

我們可以看一下官方文件的定義

如果你看懂，那你很棒。但是我知道，可以看懂的，你大概就不用繼續看這篇文章了😂，看不懂的，繼續下拉看

簡單來說你可以把Activity想像成是一個頁面單位，你現在去打開Instagram的App看看，你會發現當你點了朋友的頭像，你會被轉到至你朋友的頁面，又或者你點設定，你會被轉到設定的頁面。所以，基本上，一個頁面就會有一個Activity，因為在Activity裡面，你會寫所有有關Component控制或資料顯示的邏輯並串接到對應的XML檔。對於剛碰Android的人來說，你需要知道一個Activity基本上就會連接到一個XML檔，

你可以想像一個頁面就會對應的一個Activity。就好像開車的時候，車上一定會有一個人控制車輛。那我們寫的Code就像在開發這個開車的人的腦袋一樣，但你總不能用寫開飛機的邏輯來對應開車的頁面吧。

在這個例子就是你在前面有寫的activity_main.xml，會連接到MainActivity.java。

在這邊同時說明一下，xml以及Activity的命名方式最好是要對應的（對應方式如MainActivity與activity_main一樣）。why ? 因為這是好習慣💁。寫到後面，你會發現會有越來越多的Activity與其對應的XML檔，要尋找的時候比較方便。

結論：總之，你要寫的Code都會打在Activity上面。

2.3 Let’s start develop

好了，在你知道Activity是什麼之後，我們可以開始寫Code了。

不過，再繼續實際示範之前，要先跟大家說目前Android在開發上主要以2大語言做開發。Java & Kotlin，因為這篇文章主要是給新手讀的，所以在這邊就不跟大家多做解釋這2個語言到底差異在哪了（相信我，講了你也不會懂😊）。但你只需要知道一件事，目前Android官方主推Kotlin First，但是Java也同樣支援就是了。不論你要選哪種語言開發都可以，我在介紹的同時也會示範各別的寫法，好讓你們知道實際的差別。

讓我們在回顧一下要做的清單

連接前端Component 按下按鈕時，讀取User輸入的資料 使用User給的資料計算相對應的BMI 控制Component把資料顯示出來

好，那第一步連接Component要怎麼寫呢？

第一步是要先創造相對應的物件出來，還記得在前面XML檔有2個EditText分別對應身高和體重的輸入嗎？在Coding的寫法就會像這樣，新增上去的Code我用粗體字標示出來。

寫法：

public class MainActivity extends AppCompatActivity {



private EditText editHeight; //創造身高物件

private EditText editWeight; //創造體重物件

private Button button; //創造按鈕



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



}

}

接下來，我們要把創造的物件連起來

private EditText editHeight;

private EditText editWeight;

private Button button;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



editHeight = findViewById(R.id.editHeight); //連接Component

editWeight = findViewById(R.id.editWeight); //連接Component

button = findViewById(R.id.btnCalculate); //連接Component }

注意到那個id，剛好就是對應到XML上面Component上面的id

<EditText

android:id="@+id/editWeight"

android:layout_width="200dp"

android:layout_height="wrap_content"

android:layout_marginBottom="30dp"

android:hint="重量"

app:layout_constraintBottom_toTopOf="@+id/txtResult"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent" />



<EditText

android:id="@+id/editHeight"

android:layout_width="200dp"

android:layout_height="wrap_content"

android:layout_marginBottom="10dp"

android:hint="身高"

app:layout_constraintBottom_toTopOf="@+id/editWeight"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent" />

目前做到這裏，你就算是做完第一步的東西了。

接下來第二步：按下按鈕時，讀取User輸入的資料

現在我們有一個按鈕的物件了，我們要寫出可以偵測Listen當User按下按鈕時的反應了，具體寫法如下。

public class MainActivity extends AppCompatActivity {



private EditText editHeight;

private EditText editWeight;

private Button button;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



editHeight = findViewById(R.id.editHeight);

editWeight = findViewById(R.id.editWeight);

button = findViewById(R.id.btnCalculate);



button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {



//這邊可以寫User按下按鈕時的要做的事情



}

});



}

}

有沒有注意到其實語言這個東西是要設計給人看的，setOnClickListener是不是有很好讀懂，它表示當按下按鈕時就要做什麼的意思。至於其他的我就不做解釋了，你可以是當它要召喚setOnClickListener功能必須要額外打出來的Code，但是他還是有被打出來的意義的。

好，我們把按鈕問題處理好了，那接下來要處裡讀取User打進EditText的資料了，具體Code如下。

private EditText editHeight;

private EditText editWeight;

private Button button;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



editHeight = findViewById(R.id.editHeight);

editWeight = findViewById(R.id.editWeight);

button = findViewById(R.id.btnCalculate);



button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {



//這邊可以寫User按下按鈕時的要做的事情



editHeight.getText().toString(); //get身高資料並轉換成String

editWeight.getText().toString(); //get體重資料並轉換成String



}

});

}

String表示字串物件的意思

double表示數字含小數點物件的意思

可以看得出來要拿取資料也是非常直覺的打法，就是GetText就對了。雖然，在這邊我們確實是getText並轉換成String了，但是，可以發現我們Get的text並沒有可以先放的地方，他就只是拿而已，但並沒有要指定給誰，因此我們要指定一個新的double物件幫它拿如下。

public class MainActivity extends AppCompatActivity {



private EditText editHeight;

private EditText editWeight;

private Button button;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



editHeight = findViewById(R.id.editHeight);

editWeight = findViewById(R.id.editWeight);

button = findViewById(R.id.btnCalculate);



button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {



//這邊可以寫User按下按鈕時的要做的事情



double Weight = editHeight.getText().toString();

double Height = editWeight.getText().toString();



}

});

}

}

喔，不，你有沒有發現你有2個紅線了？前面有說過你只要有紅線你是無法run出來的，你必須把紅線問題解決掉。不信，你可以跑一次看看，你會得到以下訊息。

注意它紅色的錯誤訊息 error: incompatible types: String cannot be converted to double

從它訊息你也可以明顯的判斷出來問題出在哪？原來是String不能轉換成double物件，所以我們要先把String轉換成double才能給double物件，這應該是一個滿簡單的道理，就像水要先轉換成冰塊才能加進啤酒喝一樣的道理。

那要怎麼轉換呢？首先，再給你答案之前，你可以把這個問題丟給Google看看，Google搜尋：“Java how to convert String to double”，如果你可以獨立處理這道問題，那恭喜你，你很棒。如果不行，那恭喜你，你也很棒🤔。

以下是問題的答案

public class MainActivity extends AppCompatActivity {



private EditText editHeight;

private EditText editWeight;

private Button button;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



editHeight = findViewById(R.id.editHeight);

editWeight = findViewById(R.id.editWeight);

button = findViewById(R.id.btnCalculate);



button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {



//這邊可以寫User按下按鈕時的要做的事情 double Weight = Double.parseDouble(editWeight.getText().toString());

double Height = Double.parseDouble(editHeight.getText().toString());



}

});

}

}

如果做到這邊沒問題，那我們就可以開始處理第三步驟了

使用User給的資料計算相對應的BMI

首先，請你先Google BMI的計算公式出來。給你30秒時間找

1

2

3

30

好，30秒到了，可以看到計算方式如下

現在我們知道公式是什麼了(注意身高是Meter)，具體Code如下

public class MainActivity extends AppCompatActivity {



private EditText editHeight;

private EditText editWeight;

private Button button;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



editHeight = findViewById(R.id.editHeight);

editWeight = findViewById(R.id.editWeight);

button = findViewById(R.id.btnCalculate);



button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {



//這邊可以寫User按下按鈕時的要做的事情



double Weight = Double.parseDouble(editWeight.getText().toString());

double Height = Double.parseDouble(editHeight.getText().toString());



double BMI = Weight / (Height * Height); //計算答案

}

});

}

}

現在這BMI已經有你計算的結果了。現在只差最後一步了

控制TextView Component把資料顯示出來

我想把這部分交給你來做看看，所以請先暫時不要繼續往下翻

還偷看啊你？

好啦，給你提示

答案Code如下

public class MainActivity extends AppCompatActivity {



private EditText editHeight;

private EditText editWeight;

private Button button;

private TextView txtResult;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



editHeight = findViewById(R.id.editHeight);

editWeight = findViewById(R.id.editWeight);

button = findViewById(R.id.btnCalculate);

txtResult = findViewById(R.id.txtResult);



button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {



//這邊可以寫User按下按鈕時的要做的事情



double Weight = Double.parseDouble(editWeight.getText().toString());

double Height = Double.parseDouble(editHeight.getText().toString());



double BMI = Weight / (Height * Height);



txtResult.setText(String.valueOf(BMI));



}

});

}

}

粗體字表示新增的Code，現在你可以開始嘗試Run你的App了。請記得身高體重的資料都一定要輸入進去，不然App會無法運作

如果你的App有成功顯示，那恭喜你解鎖人生開發第一隻App成就了，你現在可以拿給你身邊的人炫耀了。

題外話：如果你發現你的答案是0.幾開頭，代表你忘記你的身高單位是公尺了，記得身高166公分要轉換乘1.66🤦🏽‍♂️公尺。

對了，以下為Kotlin的寫法

你要記得在開一個新專案，然後語言那邊記得改Kotlin

在開新專案

XML檔案的寫法是一樣，但以下是Kotlin的寫法

class MainActivity : AppCompatActivity() {





override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)



//這邊可以寫User按下按鈕時的要做的事情

val btnCalculate: Button? = findViewById(R.id.btnCalculate)

val editHeight: EditText = findViewById(R.id.editHeight)

val editWeight: EditText = findViewById(R.id.editWeight)

val txtResult: TextView = findViewById(R.id.txtResult)





btnCalculate?.setOnClickListener {

val weight = editWeight.text.toString().toDouble()

val height = editHeight.text.toString().toDouble()



val BMI = weight / (height * height)

txtResult.text = BMI.toString()

}

}

}

幹，我終於打完基本教學了，我現在感想如下

幹爆累……但是我等等還要繼續寫公司的Code以及天殺的實習報告😀👍

SECTION 3

如果你順利的看到這邊的話，恭喜你成功撐下去了。這大概就是Android基礎開發大概的樣子了。 但是，說實話，這個App實際上還有非常多的缺點例如：

如果使用者輸入的東西不是數字的問題

使用者數字無限制輸入

APP長的太醜（我的問題）

使用者只輸入身高，體重留空

更多潛在問題….

以上的問題，你可以自己實驗看看，你會發現APP會直接Crash掉，這時身為開發者的你，必須預先找出問題並排除掉潛在的風險。

至於，如何做？

就是看你本身的願不願意花時間解決，如果碰到難題，你還願意花時間、精力繼續Google問題的答案。那恭喜你，你可能會慢慢的往這個坑陷下去，越陷越深。

加油吧~

以下是推薦在Android開發常用的資源

最常用的

Android官方資源

推薦書單

GITHUB

Stack Overflow

我覺得目前來說，以後文章可能分2種模式，一種為技術分享，另一種則是新手教學。但我現在累了，有機會會在繼續寫，如果我還活著的話。