【Android Studio】EditTextの入力監視、入力内容検知【日本語】

AndroidStudioでEditTextの入力を監視し、入力されたときに入力された文字を取得するコードを作ってみます。

 

他のプログラミングに関する記事はこちら

スポンサーリンク


 

【前提】

プロジェクトを作成した状態から、Layoutのxmlは以下の通り更新しているものとします。

内容としては最初から用意されているHello WorldのTextViewをEditText(idはtext1)に変更した感じです。

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

    <EditText
        android:id="@+id/text1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="50sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

【早速実装してみる】

テキスト入力を監視するにはTextWatcherを使います。

使い方はTextWatcherのインターフェースを使うだけです。

以下、コード(全文)です。

package com.example.yosokutest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity implements TextWatcher {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.text1);
        // リスナーを登録
        editText.addTextChangedListener(this);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        // テキスト変更後に変更されたテキストを取り出す
        String inputStr= s.toString();
        // 取得したテキストをログに出力
        Log.d("テスト",inputStr);
    }
}

 

上記コードをコピペして、赤波線でエラーが出ているところにカーソルをあてる>Alt+Enterでimportとすれば動きます。

上記コードの状態でエミュ等を起動しテキスト欄に文字を入力すると、入力した文字がログに出力されます。

 

【解説】

追加したのは以下の通りです。

・11行目、『implements TextWatcher』の記述
・18~20行目の記述
・23~37行目の記述

 

11行目、『implements TextWatcher』の記述

public class MainActivity extends AppCompatActivity implements TextWatcher {

TextWatcherを継承させてます。
23~37行目の記述のメソッドを使えるようにしてます。

 

18~20行目の記述

        EditText editText = findViewById(R.id.text1);
        // リスナーを登録
        editText.addTextChangedListener(this);

リスナーを設定するEditTextを取得して、リスナーを設定してます。
リスナーとは、簡単にいうと監視対象に何かアクションがされた場合に、そのアクションに応じて何らかの処理をさせますよっていう設定です。

 

23~37行目の記述

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        // テキスト変更後に変更されたテキストを取り出す
        String inputStr= s.toString();
        // 取得したテキストをログに出力
        Log.d("テスト",inputStr);
    }

継承したTextWatcherのメソッド群です。
簡単に説明すると、

beforeTextChangedは文字を入力される前に起動されるメソッドで、入力される前の文字列や文字の開始位置等を取得できます。
onTextChangedは文字が入力されている最中に起動されるメソッドで、入力された後の文字列や文字の開始位置等を取得できます。
afterTextChangedは文字が入力されている最後に起動されるメソッドで、入力された後の文字列を返します。

以下のサイトがわかりやすくまとめてくれていたので、紹介しておきます(感謝)
https://akira-watson.com/android/textwatcher.html

 

実際に使ってみた感じ、onTextChangedとafterTextChangedはほぼ挙動が変わらなかったです。

どちらのメソッドでも、入力された後の文字を取得できる感じでした。

色々適当に使ってみた際に見つけた違いとしては、文字が入力されている状態から全文字を消した場合に限り、afterTextChangedが起動されないっぽいことと、afterTextChangedの方には入力された文字からの文字数とかが取得できなかったので、細かい処理をするのであればonTextChangedの方がよさそう?ってぐらいでした。

 

他のプログラミングに関する記事はこちら

スポンサーリンク