2011年10月6日木曜日

EditText

テキストを入力するには、EditTextを使います。特定の文字しか入力できないようにしたり、複数行のテキストを入力することもできます。またパスワードを入力する場合は、基本的には伏せ字(*)で表示します。

Androidアプリには「パスワードを表示する」というオプションがあるものもたくさんあります。セキュリティ面から考えると問題があるのですが、誤入力を避けるために用意されているのでしょう。今回はそれに倣ってパスワードを表示したり非表示にするサンプルを用意しました。


テキストを入力する

Androidプロジェクトの設定
プロジェクト名:EditTextTest1
ビルドターゲット:Android 2.1-update1
アプリケーション名:EditTextTest1
パッケージ名:jp.co.triware.samples.EditTextTest1
アクティビティーの作成:EditTextTest1
最小SDKバージョン:7
EditTextTest1.java
package jp.co.triware.samples.EditTextTest1;

import android.app.Activity;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;

public class EditTextTest1 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // パスワード入力エリアとパスワード表示チェックボックス
        final EditText etPassword = (EditText)findViewById(R.id.et_password);
        final CheckBox cbPassword = (CheckBox)findViewById(R.id.cb_password);

        // チェックボックスがクリックされたときの処理
        cbPassword.setOnClickListener(new View.OnClickListener() {
            // @Override // JDK 1.5ではビルドエラー
            public void onClick(View v) {
                // カーソル位置(選択範囲)取得
                int posStart = etPassword.getSelectionStart();
                int posEnd = etPassword.getSelectionEnd();
                // パスワード表示設定
                if (cbPassword.isChecked() == true) {
                    // チェックボックスONの場合はパスワードを表示する
                    etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                } else {
                    // チェックボックスOFFの場合はパスワードを表示しない
                    etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                }
                // カーソル位置(選択範囲)設定
                etPassword.setSelection(posStart, posEnd);
            }
        });
    }
}

単にパスワード入力欄の入力タイプを変更するだけでは、カーソルが先頭へ移動してしまいます。getSelectionStart()、getSelectionEnd()でカーソル位置を覚えておいて、setSelection()でそれを反映するようにしています。

22行目の@Overrideは、JDK 1.6では問題ないのですが、JDK 1.5ではonClick()でビルドエラーが発生します。@Overrideについての詳細はまた別の記事でご紹介する予定です。

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"
    >
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="名前: "
            />
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="name"
            android:inputType="text"
            />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="メールアドレス: "
            />
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="mail address"
            android:inputType="textEmailAddress"
            />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="パスワード: "
            />
        <EditText
            android:id="@+id/et_password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="password"
            android:inputType="textPassword"
            />
    </LinearLayout>
    <CheckBox
        android:id="@+id/cb_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="パスワードを表示する"
        android:textColor="#808080"
        android:textSize="14sp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="備考: "
        />
    <EditText
        android:id="@+id/et_password"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:inputType="textMultiLine"
        android:gravity="left|top"
        />
</LinearLayout>

android:inputTypeには入力タイプを指定します。指定する値の一部を以下の表にまとめます。
内容
textテキスト
textEmailAddressメールアドレス
textPasswordパスワード(伏字)
textVisiblePasswordパスワード(表示)
textMultiLineテキスト(複数行)
textUriURI
number数字

実行結果

0 件のコメント:

コメントを投稿