iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

Kotlin Everyday:新手寫程式踩的坑系列 第 4

Day 4 ─用Kotlin做點餐介面 (2) intent、RadioButton

  • 分享至 

  • xImage
  •  

上一篇介紹基本的頁面切換,今天來設定Activity2的頁面,主要會用到一個EditText(輸入飲料名稱)和兩個提供單選項的RadioButton,最後是一個按鈕可返回MainActivity。

使用:RadioButton、intent夾帶資料、Activity返回

▲ RadioButton
想要做一個單選項按鈕, 可以使用RadioButton元件,外面包覆RadioGroup會達到單選的效果,因為RadioGroup負責控制RadioButton的狀態。
常用語法:getCheckedRadioButtonId()可以取得被選取RadioButton的ID

如何建立點餐系統

  1. 觀察一下第二個頁面要做的東西,一個輸入飲料的EditText、兩個可以選擇甜度冰塊的單選項、一個返回首頁的按鈕。

  2. RadioGroup下面拉四個按鈕,特別注意設定layout_weigh,也就是權重-剩餘比例的分配,全部調為1就會平均分配

  3. 畫面做好後,開始想怎麼寫程式碼,步驟為:
    (1)輸入飲料名稱--> (2)讀取被選取RadioButton的值--> (3) 將上述資料都放入intent裡面傳送--> (4)跳轉回到MainActivity

  4. 如何讀取RadioButton的值:

  • 綁定ID findViewById
  • 取得被選取的該項 checkedRadioButtonId
val sugar = RadioGroup_sugar.findViewById<RadioButton>
(RadioGroup_sugar.checkedRadioButtonId).text
    //RadioGroup裡面的RadioButton
    //不知道被選取是哪個button,用checkedRadioButtonID來辨識
  1. Bundle+Intent傳資料:如果要傳遞的資料型態不一樣,要新增一個Bundle來放這些資料,再把Bundle放進intent裡面來傳送,多包裹一層的概念
val bundle = Bundle()
    bundle.putString("drinksKey", ed_drinks.text.toString()) 
    bundle.putString("sugarKey", sugar.toString()) //putString("Key", value)
val intent = Intent()             
intent.putExtras(bundle)
  1. 從A.Activity跳到B.Activity,再從B傳送參數回去A.Activity
    聽起來有點複雜,用三個步驟來表示:
  • 將原本單純切換頁面的startActivity替換成 startActivityForResult,參數多了一個requestCode,用以等下返回原Activity時的辨識碼

  • setResult有兩個參數,第一個是 RESULT_OK (若操作成功)、第二個是Intent,注意此intent不是原本頁面的,是另一個要攜帶結果的。

  • 接著回A.Activity複寫 onActivityResult 才能接收B傳回的值,包括:
    (1) 請求代碼
    (2) 結果代碼
    (3) 攜帶資料的 Intent

參考資料:從應用行為顯示取得結果

附上整段code可能會比較好理解:

title="Main2Activity"

btn_send.setOnClickListener {  //點擊事件
    if (ed_drinks.length() < 1)
        Toast.makeText(this, "請輸入飲料名稱", Toast.LENGTH_SHORT).show()
                //設if條件,提醒一定要輸入飲料名稱
                //Toast用法之後會介紹
    else {
        val bundle = Bundle()    //設一個放資料的Bundle
        bundle.putString("drinksKey", ed_drinks.text.toString())   //轉成String
        ...                      //省略如何取得RadioButton資料,上面有分段解釋了
        ...
        val intent = Intent()
        intent.putExtras(bundle)
        setResult(Activity.RESULT_OK, intent)
        finish()
    }
}

最後回到原本的Activity,覆寫onActivityResult接收資料,三個代數:

  1. 傳遞至 startActivityForResult() 的要求代碼
  2. B顯示指定的結果代碼。此代碼是 RESULT_OK (操作成功) 或 RESULT_CANCELED (若因故使用者退出或操作失敗)
  3. 攜帶結果資料的 Intent
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    data?.extras?.let {
        if (requestCode == 1 && resultCode == Activity.RESULT_OK)
            tv_others.text =
                    "飲料:${it.getString("drinks")}\n\n甜度:${it.getString("sugar")}\n\n冰塊:${it.getString("ice")}"
        }
    }

上一篇
Day 3 ─用Kotlin做點餐介面 (1) EditText、Activity
下一篇
Day 5 ─用Kotlin做點餐介面 (3) 顯示訊息Toast
系列文
Kotlin Everyday:新手寫程式踩的坑30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言