●EditText エディットテキスト


■文字を書き込む

android.widget.EditText edittext=(android.widget.EditText)findViewById(R.id.editText);
edittext.setText("testText");

■文字の取得

edittext.getText().toString()

■有効化・無効化


setEnabled(true)で設定してisEnabled()で取得します。


▼有効を無効に無効を有効に反転しています。

edittext.setEnabled(!edittext.isEnabled());

■フォーカスを当てる

edittext.requestFocus();

■背景色を変更する

edittext.setBackgroundColor(android.graphics.Color.RED);
元の色を復元したいときは、変更前にDrawableを保存しておくのも手ですね。

android.graphics.drawable.Drawable d=edittext.getBackground();
//edittext.setBackgroundColor(android.graphics.Color.RED);
edittext.setBackground(d);

■カーソルの位置を移動する


1文字目にカーソルを移動します。

edittext.setSelection(1);

■文字を選択する


1文字目から3文字目までを選択します

edittext.setSelection(1,3);

■カーソル位置を取得する


複数文字が選択されている場合は、開始位置がgetSelectionStart()に終了位置がgetSelectionEnd()で取得できます

int i = edittext.getSelectionStart();
int i = edittext.getSelectionEnd();

■ソフトウエアキーボードを消す


▼まずは起動時にいきなりキーボードが表示されるのを防ぐために、

protected void onCreate(Bundle savedInstanceState) {
・・・・・・
    getWindow().setSoftInputMode(android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

onCreateの中でキーボードを見えなくしておきます。


▼なにか操作したときに消すには、以下のプログラムを実行します。

android.app.Activity activity = this;
((android.view.inputmethod.InputMethodManager)activity.getSystemService(android.content.Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(view.getWindowToken(), 0);

古いバージョンだとひょっとしたらフォーカスをクリアする必要があるかもしれません。

activity.getCurrentFocus().clearFocus();

■イベント


▼クリックされたイベント

edittext.setOnClickListener(new android.view.View.OnClickListener() {
    public void onClick(android.view.View view) {

    }
});

▼フォーカスのイベント

edittext.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener(){
    @Override
    public void onFocusChange(android.view.View view, boolean hasFocus) {
        if(hasFocus) {
            //フォーカスが当たった
        }else{
            //フォーカスが外れた
        }
    }
});

▼文字が入力されたイベント

edittext.addTextChangedListener(new android.text.TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence cs, int position, int decrease, int increase) {
        //テキスト変更前
        //cs 入力された文字
    }

    @Override
    public void onTextChanged(CharSequence cs, int position, int decrease, int increase) {
        //テキスト変更
        //cs 入力された文字
    }

    @Override
    public void afterTextChanged(android.text.Editable e) {
        //テキスト変更後
    }
});

メソッドの引数で受け取るint position, int decrease, int increase などの値は、色々調べた結果、

position が編集されたカーソル位置
decrease が編集により削除される文字数
increase が編集により追加される文字数

であると思われます。

ただし、android4.4.4では4文字ある行の末尾にソフトキーボードで文字を追加すると次のようになります。

position:4
decrease:0
increase:1

しかし、android 7.0のソフトキーボードでは、このようになりました。

position:0
decrease:4
increase:5

ただ、エミュレータ上のandroid 7.0に対してパソコンのキーボードからの入力だとandroid4.4.4と同じ結果になります。
androidのバージョンにより色々動きが変わりややこやしいです。


▽数字の入力できないエディットテキストを作ってみる


文字が入力されたイベントを使えば実現できるはずです。 でも、たぶんこんなめんどくさい事をしなくても、いいんじゃないかなと思います。

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

        android.widget.EditText edittext=(android.widget.EditText)findViewById(R.id.editText);
        edittext.addTextChangedListener(new _textWatcher(edittext));
    }

    private class _textWatcher implements android.text.TextWatcher{
        android.widget.EditText edittext;
        int i;             //カーソル位置の保存
        String str;        //エディットテキストの文字を保存
        boolean flag=true; //書き込むと何度もメソッドが呼ばれるため一度目のみしか処理を実行しないためのフラグ

        //数字にマッチする正規表現
        java.util.regex.Pattern p = java.util.regex.Pattern.compile("[0-9]");

        _textWatcher(android.widget.EditText _edittext){
            edittext = _edittext;
        }

        @Override
        public void beforeTextChanged(CharSequence cs, int position, int decrease, int increase) {
            if(flag) {
                //テキストが変更される前に現状を保存
                str = cs.toString();
                i = position;
                if (0 == position && 0 < decrease && 0 < increase) {
                    i = decrease;
                }
            }
        }

        @Override
        public void onTextChanged(CharSequence cs, int position, int decrease, int increase) {}

        @Override
        public void afterTextChanged(android.text.Editable e) {
            java.util.regex.Matcher m = p.matcher(e.toString());
            if(m.find()) {
                //数字にマッチしたため復元する
                flag=false;
                edittext.setText(str);
                edittext.setSelection(i);
                flag=true;
            }
        }
    }
こんなややこしい事をしなくても、背景色を変えてエラーとわかるようにした方がいいですね。
edittext.setBackgroundColor(android.graphics.Color.RED);
とすると背景色が赤くなります。


▼キーボードからの入力チェック(ソフトウエアキーボードではありません)


以下のプログラムではaの文字を入力できなくしています。

edittext.setOnKeyListener(new android.view.View.OnKeyListener(){
    @Override
    public boolean onKey(android.view.View v, int keyCode, android.view.KeyEvent event) {
        android.util.Log.d("test",android.view.KeyEvent.KEYCODE_A+" "+(int)'a');
        if (android.view.KeyEvent.KEYCODE_A==keyCode && android.view.KeyEvent.ACTION_DOWN==event.getAction()) {
            return true;//入力キャンセルする
        }else{
            return false;
        }
    }
});


▲トップページ > android