Kotlin玩Android第02篇 從別人的作品學習(折價計算機)

本篇文章就是藉由模仿修改陳董 Don的作品來達到學習的目的,
所以此篇文章不算教學只是我個人的見解。


 

從中學到的幾件事

轉換如果拋出例外,try/catch 可以減少多行if/else判斷

if(edit_money.text?.toString()?.toDouble() == null){
    edit_money.setText("0")
}
上面程式碼的目的是將使用者輸入的文字轉成數字,
雖然我在xml介面設定我的edit_money這個EditText型態物件只能輸入數字,
但依然有些Bug會導致錯誤發生。

例子1: 將輸入清空,譬如說原本是輸入值是0,

但你連0都刪除就會出現底下例外。

java.lang.NumberFormatException: empty String

例子2: 還有因為我的輸入可以接受.87之類的浮點數文字,
都能被正確轉換成Double型態,但是如果變成"."就會出錯。

java.lang.NumberFormatException: For input string: "."
所以我將程式碼改成底下使用try/catch,轉換型態失敗丟出例外直接歸"0"就好
try {
   edit_money.text?.toString()?.toDouble()
} catch (e: NumberFormatException){// 當無法正常轉換成Double型態 
   edit_money.setText("0")
}

EditText的函數 addTextChangedListener(...)

此函數的用意是:設定 "當EditText文字改變時"的Listener,至於那個Listener必須是繼承TextWatcher

撰寫的過程基本上就是寫一個object繼承TextWacher並override內部的三個函數。
但實際上我只在afterTextChanged()函數內撰寫主要的程式碼,主要是先預處理使用者輸入的Money接著呼叫calcuateDiscount()。

calcuateDiscount()

這個函數主要是參考edit_money和seedBar的值,修改畫面內的textView的text屬性。可以注意的是String.format ("%.2f")會成功顯示小數點後二位,或者你能用更加Kotlin的"%.2f".format(變數) 寫法如下方程式碼。
(Kotlin實際上是用擴充函數的方式,封裝了java.lang.String)

此外如果你跟我之前一樣自作聰明用了"%0.2f"的話在執行期間會出錯,因為那樣沒有定義你要保留的字元數,"%09.2f"的用法才是正確的。

"%09.2f"代表數字用9個字元表示&不足用0補足,保證顯示小數點後2位


EditText的函數 setOnEditorListener(...)

雖然我的App其實沒用這個setOnEditorListener,但這個Listener是陳董在App的監聽寫法,使用原因可能是陳董用了Hint去提示使用者輸入。

如果是用TextWatcher一變動就去計算反而輸入的Hint會完全看不到,
並且我版本的App無法做到每次輸入結束都要加個$字號在金額前方。

那Code內部一樣先做預處理再做計算,

那底下Code我有微調成符合我的App版本,比較特別的是用actionId來判斷是什麼情況才觸發了此函數(想知道更多,可參考官方API)

個人常用到的AndroidStudio快捷鍵

1. 顯示該函數的參數
 (將文字輸入游標移到函數fun內,再按下快捷鍵)
OSX: CMD + P
Windows: Ctrl + P
 
2.自動產生要實作的函數Code,可以不用手打那些要overwrite的函數



 (將文字輸入游標移到類別class內,再按下快捷鍵)
OSX: Ctrl + O

3.查看該函數或類別的相關訊息。
OSX: Command + Y

個人檢討

老實說實作這個App,我主要是先看陳董Don的App介面就直接去嘗試(雖然並沒抄完全)。所以後來在看他的Code時才知道我的Code哪邊太多餘,甚至其實有更好解法XD。
譬如上面用到try_catch還沾沾自喜,但其實能用toFloatOrNull()這種直接回傳Null結果的函數。

還有我版本的的App因為是輸入進去算所以顯示上較為快速,
但就不像陳董的版本有UI提示

留言

這個網誌中的熱門文章

Kotlin玩Android第03篇 Listview(01 ArrayAdapter)

使用Intent在Activity間傳遞資料(bundle)

golang本地測試如何繞過防火牆詢問允許