Androidアプリを作り始めて気が付いたが、スマホだと入力方法としてGoogle音声入力が選べる。
それは、スマホの環境設定によって入力言語を日本語、タイ語、英語など多くの言語に対応している。
そして、Google音声入力がそれらの言語で入力できる。
しかも、いろいろな言語で入力できるだけではなく、イントネーションなどにより言語を自動的に選んでくれる。
逆に云うと、英語で入力しようとしても余りに日本語的だとカタカナなどで入力されてしまう。
また、英語になっても
This is a pain
などと間違った単語が選ばれることもある。
ということで、今回は、このきちんと思い通りの入力が出来た時をOK、間違った選択をされた時、NGのボタンを配置してそれぞれの回数をカウントアップするようなアプリにしてみた。
ここで必要な技術は、主にボタンの配置とカウントアップするカウンターの配置である。
出来上がったアプリの画面は以下のようなものである。
ここでは、カウントも入力・出力で構成したので、余分に配置されているが以下で改善した。
英語 | タイ語 | 英語? | 日本語 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
コードについて
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">イベントとリスナサンプル</string>
<string name="tv_name">音声入力してください</string>
<string name="bt_click">表示</string>
<string name="bt_clear">クリア</string>
<string name="bt_ok">OK</string>
<string name="ok_count">OKカウント</string>
<string name="bt_ng">NG</string>
<string name="ng_count">NGカウント</string>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tv_name"/>
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt_click"/>
<Button
android:id="@+id/btClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt_clear"/>
</LinearLayout>
<TextView
android:id="@+id/tvOutput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:text=""
android:textSize="25sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btOk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt_ok"/>
<EditText
android:id="@+id/etOk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="text" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btNg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt_ng"/>
<EditText
android:id="@+id/etNg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="text" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
package com.example.hellosample
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import java.text.SimpleDateFormat
import java.util.Date
import java.io.File
import java.io.IOException
import kotlin.math.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//表示ボタンであるButtonオブジェクトを取得。
val btClick = findViewById<Button>(R.id.btClick)
//リスナクラスのインスタンスを生成。
val listener = HelloListener()
//表示ボタンにリスナを設定。
btClick.setOnClickListener(listener)
//クリアボタンであるButtonオブジェクトを取得。
val btClear = findViewById<Button>(R.id.btClear)
//クリアボタンにリスナを設定。
btClear.setOnClickListener(listener)
//表示ボタンであるButtonオブジェクトを取得。
val btOk = findViewById<Button>(R.id.btOk)
//表示ボタンであるButtonオブジェクトを取得。
val btNg = findViewById<Button>(R.id.btNg)
//OK.NGボタンにリスナを設定。
btOk.setOnClickListener(listener)
btNg.setOnClickListener(listener)
}
/**
* ボタンをクリックしたときのリスナクラス。
*/
private inner class HelloListener : View.OnClickListener {
override fun onClick(view: View) {
//名前入力欄であるEditTextオブジェクトを取得。
val input = findViewById<EditText>(R.id.etName)
//名前入力欄であるEditTextオブジェクトを取得。
val input_ok = findViewById<EditText>(R.id.etOk)
//名前入力欄であるEditTextオブジェクトを取得。
val input_ng = findViewById<EditText>(R.id.etNg)
//入力されたcount文字列を取得。
val inputStr_ok_count = input_ok.text.toString()
//入力されたcount文字列を取得。
val inputStr_ng_count = input_ng.text.toString()
//メッセージを表示するTextViewオブジェクトを取得。
val output = findViewById<TextView>(R.id.tvOutput)
//入力された名前文字列を取得。
val inputStr = input.text.toString()
val df = SimpleDateFormat("HH:mm:ss") //"yyyy/MM/dd HH:mm:ss"
val date = Date()
//idのR値に応じて処理を分岐。
when(view.id) {
//表示ボタンの場合…
R.id.btClick -> {
//入力された名前文字列を取得。
val inputStr = input.text.toString()
//メッセージを表示。
output.text = df.format(date) + "\n"+inputStr + "さん、こんにちは!" //inputStr + "さん、こんにちは!"
}
//クリアボタンの場合…
R.id.btClear -> {
//名前入力欄を空文字に設定。
input.setText("")
//メッセージ表示欄を空文字に設定。
output.text = ""
input_ok.setText(inputStr_ok_count)
input_ng.setText(inputStr_ng_count)
}
//OKボタンの場合…
R.id.btOk -> {
//OKカウントアップ
val intVal_ok: Int = input_ok.text.toString().toInt()+1
val intStr_ok = intVal_ok.toString()
val inputStr_ok_count = intStr_ok
//数字を表示。
input_ok.setText(inputStr_ok_count)
}
//NGボタンの場合…
R.id.btNg -> {
//NGカウントアップ
val intVal_ng: Int = input_ng.text.toString().toInt()+1
val intStr_ng = intVal_ng.toString()
val inputStr_ng_count = intStr_ng
//数字を表示。
input_ng.setText(inputStr_ng_count)
}
}
}
}
}
上記のコードでは以下のような画面になります。
上の画面と比べて、OKとNGの部分の数値が一つになってすっきりしました。
日本語 | タイ語 | 英語 |
---|---|---|
![]() |
![]() |
![]() |
まとめ
・英語、タイ語、日本語入力の判定アプリを作ってみた
・演算によりカウントアップを配置した
・履歴を保存できないので対応したい