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


<<:  今晚来谈谈中国「能耗双控」政策下,受惠与冲击的产业

>>:  【Day17】[资料结构]-堆积Heap

Day 13:第三方套件、授权

前言 以前很经常使用 GitHub 上的各种套件, 不管是大到页面,小到按钮,深到语法,都喜欢用自己...

SQL Server 记录档的问题与解决方案 - 心得分享

DBA Bootcamp 几天前,oncall DBA 接到请求支援的电话,状况是这样的… 有一个 ...

Day 1 : 前言-为什麽要撰写这系列文章

这篇文诞生的原因: 我从小就对资讯世界抱持着莫大的好奇与憧憬,到了高中稍微接触程序语言後让我更加想了...

[Day 26] Android Studio 七日陨石开发:嘘! 我正在监听这个元件

前言 昨天我们设计好UI介面後, 我们有一堆按钮和文字框的"元件", 要让这些元...

JS ES6 箭头函式 DAY73

箭头函式 传统函式 const callName = function(someone){ retu...