コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

Androidアプリ入門 No.09 EditTextの入力制限関連属性

今風に書き直した記事がありますので、合わせて参照ください。
blog.webarata3.link

EditText

EditTextはTextViewのサブクラスであるためTextViewと同じ属性が使用できる。ここではEditTextで使える属性を説明する。

入力制限関連属性

入力制限やIMEの制御をする属性は以下となる。

属性 説明
digits 入力可能な数値、記号の文字セットを指定する。指定した文字以外の入力ができなくなる。
inputType 入力する内容に応じたソフトウェアキーボードを表示する。

まずdigitsの例を見る。共通のstrigns.xmlは以下。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, MainActivity!</string>
    <string name="app_name">ActivityTest</string>

    <style name="commonLayout">
        <item name="android:orientation">horizontal</item>
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

    <style name="commonLabel">
        <item name="android:layout_width">100dp</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#000</item>
        <item name="android:textSize">30sp</item>
    </style>

    <style name="common">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#000</item>
        <item name="android:textSize">30sp</item>
    </style>
</resources>

main.xmlは以下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff"
    >
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="0〜9-"
            />
        <EditText
            style="@style/common"
            android:digits="01234567890-"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="偶数"
            />
        <EditText
            style="@style/common"
            android:digits="02468"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="abc"
            />
        <EditText
            style="@style/common"
            android:digits="abc"
            />
    </LinearLayout>
</LinearLayout>

実行例は以下となる。画面ではわからないが、指定した文字しか入力できないようになっている。

次に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 時刻を入力する場合。

まず、わかりやすい数値関係の例を挙げる。スタイルをstrings.xmlに定義する。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, MainActivity!</string>
    <string name="app_name">ActivityTest</string>

    <style name="commonLayout">
        <item name="android:orientation">horizontal</item>
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

    <style name="commonLabel">
        <item name="android:layout_width">100dp</item>
        <item name="android:layout_height">fill_parent</item>
        <item name="android:textColor">#000</item>
        <item name="android:textSize">15sp</item>
        <item name="android:gravity">top</item>
    </style>

    <style name="common">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#000</item>
        <item name="android:textSize">30sp</item>
    </style>
</resources>

次に、main.xmlを以下のようにする。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff"
    >
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="number"
            />
        <EditText
            style="@style/common"
            android:inputType="number"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="numberSigned"
            />
        <EditText
            style="@style/common"
            android:inputType="numberSigned"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="numberDecimal"
            />
        <EditText
            style="@style/common"
            android:inputType="numberDecimal"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="numberSigned|numberDecimal"
            />
        <EditText
            style="@style/common"
            android:inputType="numberSigned|numberDecimal"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="phone"
            />
        <EditText
            style="@style/common"
            android:inputType="phone"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="datetime"
            />
        <EditText
            style="@style/common"
            android:inputType="datetime"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="date"
            />
        <EditText
            style="@style/common"
            android:inputType="date"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="time"
            />
        <EditText
            style="@style/common"
            android:inputType="time"
            />
    </LinearLayout>
</LinearLayout>

実行結果は以下。おおよそ入力できる文字をカバーした例。面白いのはtimeの入力でam、pmだけアルファベットが入力できる。大文字のAM、PMは入力できない。

次に、Web、メール関連。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff"
    >
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="textUri"
            />
        <EditText
            style="@style/common"
            android:inputType="textUri"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="textEmailAddress"
            />
        <EditText
            style="@style/common"
            android:inputType="textEmailAddress"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="textPassword"
            />
        <EditText
            style="@style/common"
            android:inputType="textPassword"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="textVisiblePassword"
            />
        <EditText
            style="@style/common"
            android:inputType="textVisiblePassword"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="textWebEditText"
            />
        <EditText
            style="@style/common"
            android:inputType="textWebEditText"
            />
    </LinearLayout>
</LinearLayout>

エミュレータだと、実際に動きはよくわからないが実機で動かすと動作が微妙に異なる。まず、エミュレータの画面は以下。

実機(GALAXY S)だとtextURIの場合には「/」が表示され、textEmailAddressを選択すると「/」のところが「@」になったりする。
最後に、改行の制御を確認する。main.xmlは以下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff"
    >
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="text"
            />
        <EditText
            style="@style/common"
            android:inputType="text"
            />
    </LinearLayout>
    <LinearLayout
        style="@style/commonLayout"
        >
        <TextView
            style="@style/commonLabel"
            android:text="textMultiLine"
            />
        <EditText
            style="@style/common"
            android:inputType="textMultiLine"
            />
    </LinearLayout>
</LinearLayout>

実行結果は以下。textMultiLineは入力域の端まで行くと自動で文字列を折り返す。また、改行を入力して任意に折り返すこともできる。