14808


こんばんは。

EditTextの入力終了検知を確定を検出することで行おうと考えています。検索で次のようなコードを見つけました。

[code]

    edit1.addTextChangedListener(new TextWatcher()
    {
            int currentLength = 0;
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            currentLength = s.toString().length();
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            Log.v("", "after:" + s.toString());
            if (s.toString().length() < currentLength) {
                return;
            }
            boolean unfixed = false;
            Object[] spanned = s.getSpans(0, s.length(), Object.class);
            if (spanned != null) {
                for (Object obj : spanned) {
                    if (obj instanceof android.text.style.UnderlineSpan) {
                        unfixed = true;
                    }
                }
            }
            if (!unfixed) {
                Toast toast = Toast.makeText(getApplicationContext(), "確定", Toast.LENGTH_SHORT);
                toast.show();
            }
        }
    });
    
[/code]

うまく動作するのですが、確定後にソフトキーボードのDeleteキーを押したときにも、確定が発生します。

これを防ぐ方法はありますでしょうか？

よろしくお願いいたします。


CC BY-SA 3.0
2015-08-24T09:50:27.610
14800
2015-08-24T13:58:14.757
516
question
android
Android - 文字入力の確定検知について


調べた結果、ソフトキーボードのDeleteキーが入力されると、`onTextChanged(CharSequence s, int start, int
before, int
count)`の[countが0になる](https://stackoverflow.com/questions/12202047/detect-
backspace-in-textwatcher)そうです。

そこで、次のようにしました。

[code]

    edit1.addTextChangedListener(new TextWatcher() {
    
        boolean keycodeFlag = false; // 上記コードに追加
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
            // このブロック追加
            if (count == 0) {
                keycodeFlag = true;
            }
        }
    
        @Override
        public void afterTextChanged(Editable s) {
    
            if (s.toString().length() < currentLength || keycodeFlag) {   // 変更
                keycodeFlag = false;  // 追加
                return;
            }
        }
    }
    
[/code]

これで、質問内容のDeleteキーが確定として検知されるのを防ぐことができるようになりました。  
（Genymotionエミュレータ上Android 4.2.2, 4.4.4, 5.0で確認）


CC BY-SA 3.0
2015-08-24T13:58:14.757
14808
2015-08-24T13:58:14.757
2017-05-23T12:38:55.250
-1
516
14800
answer