最初からのAndroid開発 View(画面部品) No.3 EditText

この記事は、最初からのAndroid開発という名前ですが、全くの初心者は対象としていません。Java言語を知っていて、Androidの入門書で簡単なアプリを作ったことがあるような人を対象としています。
この記事は、Androidの昔書いた記事のまとめの焼き直しです。

記事共通の話は次のページにまとめています。合わせてご確認ください。

最初からのAndroid開発 共通の話
最初からのAndroid開発まとめこの記事は、最初からのAndroid開発という名前ですが、全くの初心者は対象としていません。Java言語を知っていて、Androidの入門書で簡単なアプリを作ったことがあるような人を対象としています。この記

この記事の完全なソースコードは次のリポジトリのView03にあります。

webarata3/begin_Android
最初からのAndroid開発. Contribute to webarata3/begin_Android development by creating an account on GitHub.

EditText

今回のプログラム

MainActivity.java

package com.example.view03;

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

import com.google.android.material.textfield.TextInputEditText;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

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

        TextView textView = findViewById(R.id.textView);
        ((EditText) findViewById(R.id.editText)).addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

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

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="singleLine"
            android:singleLine="true" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="maxLength=10"
            android:maxLength="10" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="文字種" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="number"
            android:inputType="number" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="numberSigned"
            android:inputType="numberSigned" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="numberDecimal"
            android:inputType="numberDecimal" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="numberSigned|numberDecimal"
            android:inputType="numberSigned|numberDecimal" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="phone"
            android:inputType="phone" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="datetime"
            android:inputType="datetime" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="date"
            android:inputType="date" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="time"
            android:inputType="time" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="textUri"
            android:inputType="textUri" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="textEmailAddress"
            android:inputType="textEmailAddress" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="textPassword"
            android:inputType="textPassword" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="textVisiblePasswod"
            android:inputType="textVisiblePassword" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="textWebEditText"
            android:inputType="textWebEditText" />

    </LinearLayout>
</ScrollView>

実行結果

見切れていますので、以降個別の画面で確認してください。

警告

上記のxmlファイルのEditTextの部分で警告が出ています。

対応するには、次の属性を追加します。

android:hint="hint"
android:inputType="number"
android:autofillHints="username"

以下、今回のサンプルでは、これらの属性は付与しません。

改行させない

EditTextは、標準では改行を入れることができます。改行を入れられないようにするには、android:singleLine属性をtrueに設定します。

改行の設定は最初の例では次のようにしています。

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="singleLine"
    android:singleLine="true" />

最大文字数の設定

入力可能な文字数を設定するには、android:maxLength属性を設定します。

最大文字数の設定は、最初の例では次のようにしています。

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="maxLength=10"
    android:maxLength="10" />

文字種の設定

入力可能な文字種を設定するには、android:inputType属性を設定します。設定できる値は次のとおりです。

種類 説明
none 入力不可。
text 普通のテキスト。
textCapCharacters すべて大文字で入力する場合。
textCapWords 単語の先頭を大文字で入力する場合。
textCapSentences 文章の先頭を大文字で入力する場合。
textAutoCorrect 文字の入力を自動で修正する場合。
textAutoComplete 文字の補完入力する場合。
textMultiLine 文字を複数行入力する場合。
textImeMultiLine 通常の文字入力時は複数入力を許可せず、IMEによって複数行入力を設定する場合。
textUri URLを入力する場合。
textEmailAddress メールアドレスを入力する場合。
textEmailSubject メールの件名を入力する場合。
textShortMessage ショートメッセージを入力する場合。
textLongMessage ロングメッセージを入力する場合。
textPersonName 人名を入力する場合。
textPostalAddress 住所を入力する場合。
textPassword パスワードを入力する場合。
textVisiblePassword パスワードの文字を見せて入力する場合。
textWebEditText HTMLを入力する場合。
textFilter 他のデータでフィルタされた文字を入力。
textPhonetic 発音記号を入力する場合。
number 数値入力する場合。
numberSigned 符号付きの数値を入力する場合。
numberDecimal 小数入力する場合。
phone 電話番号を入力する場合。
datetime 日付時刻を入力する場合。
date 日付を入力する場合。
time 時刻を入力する場合。

すべてのパターンで動作を確認できてはいません。最初の例では次のようにしています。

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="number"
    android:inputType="number" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="numberSigned"
    android:inputType="numberSigned" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="numberDecimal"
    android:inputType="numberDecimal" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="numberSigned|numberDecimal"
    android:inputType="numberSigned|numberDecimal" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="phone"
    android:inputType="phone" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="datetime"
    android:inputType="datetime" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="date"
    android:inputType="date" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="time"
    android:inputType="time" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="textUri"
    android:inputType="textUri" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="textEmailAddress"
    android:inputType="textEmailAddress" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="textPassword"
    android:inputType="textPassword" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="textVisiblePasswod"
    android:inputType="textVisiblePassword" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="textWebEditText"
    android:inputType="textWebEditText" />

実行例は、メールアドレスの例を示します。

アルファベットと、メールアドレスに必須の、「@」と「.」がキーボードに表示されています。このように用途にあったキーボードが表示されるようになります。

入力の監視

EditTextの入力をリアルタイムに監視するには、TextWatcherを実装します。

TextView textView = findViewById(R.id.textView);
((EditText) findViewById(R.id.editText)).addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

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

    @Override
    public void afterTextChanged(Editable s) {
    }
});    

TextWatcherでは3つのメソッドを実装する必要があります。

コメント