iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

Android 初新者系列 第 17

Day17 - RadioButton(二)

昨天學會使用getCheckedRadioButtonId
這功能一般都用在表單單選
例如:性別、年齡區間、問卷滿意程度
今天要的是點選完後直接變更輸出結果
比如:原本為溫度為攝氏,點選華氏RadioButton後,馬上把攝氏溫度的結果轉變為華氏的溫度結果
今天來學習速度單位轉換,把台灣常用的公里/小時和美國用的英里/小時做轉換

開始

先拉出兩個RadioButton,並且把他們包在一個RadioGroup裡面
一個EditText給使用者輸入數值
兩個TextView分別顯示公里/小時、英里/小時的速度
當使用者輸入好數值,選擇輸入的值為公里或是英里
下面TextView馬上顯示轉換後的數值

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">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="70dp"
        android:text="輸入格式"
        android:textSize="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="@+id/textView"
        app:layout_constraintStart_toStartOf="@+id/textView"
        app:layout_constraintTop_toBottomOf="@+id/textView">

        <RadioButton
            android:id="@+id/rb_mi"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="英里" />

        <RadioButton
            android:id="@+id/rb_km"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="公里" />
    </RadioGroup>

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/radioGroup" />
    <TextView
        android:id="@+id/tv_km"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="公里/小時:"
        android:textSize="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_mi" />
    <TextView
        android:id="@+id/tv_mi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="英里/小時:"
        android:textSize="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText" />
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

增加:
RadioGroup的setOnCheckedChangeListener監聽事件:點選馬上變更顯示結果
EditText的addTextChangedListener監聽事件:新增或刪減字馬上更改結果
1公里 = 0.621371192英里
我們要把公里、英里計算完
才能顯示出來結果

因為兩個監聽事件的程式碼一樣
所以我們把計算和顯示的程式碼寫到自訂的calc()裡
之後再去呼叫

addTextChangedListener有三個要引入三個方法
目前用不到onTextChanged、beforeTextChanged
但仍需要寫這兩種方法出來
只是裡面不需要寫程式

package com.example.km;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements TextWatcher, RadioGroup.OnCheckedChangeListener {

    private RadioGroup radioGroup;
    private EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        radioGroup = findViewById(R.id.radioGroup);
        editText = findViewById(R.id.editText);

        radioGroup.setOnCheckedChangeListener(this);

        editText.addTextChangedListener(this);

    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        //目前用不到
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        //目前用不到
    }

    @Override
    public void afterTextChanged(Editable editable) {
        calc();
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
        calc();
    }

    private void calc() {
        TextView tv_km = findViewById(R.id.tv_km);
        TextView tv_mi = findViewById(R.id.tv_mi);

        double km,mi;
        if (radioGroup.getCheckedRadioButtonId() == R.id.rb_km){
            km = Double.parseDouble(editText.getText().toString());
            mi = km*0.621;
        }
        else{
            mi = Double.parseDouble(editText.getText().toString());
            km = mi/0.621;
        }
        tv_km.setText("公里/小時:"+km);
        tv_mi.setText("英里/小時:"+mi);
    }
}

執行結果:
預設為英里
https://ithelp.ithome.com.tw/upload/images/20210926/20141769dHMt5yWUHl.png

點選英里
https://ithelp.ithome.com.tw/upload/images/20210926/20141769y7ix8j1RVF.png

點選公里
https://ithelp.ithome.com.tw/upload/images/20210926/201417694sBlWCUmfT.png


上一篇
Day16 - RadioButton(一)
下一篇
Day18 - CheckBox
系列文
Android 初新者30

尚未有邦友留言

立即登入留言