LoginSignup
1
1

More than 5 years have passed since last update.

Androidの英字キーボードの確定でafterTextChangedが発火しない件

Last updated at Posted at 2017-12-07

こんにちは、僕の記事はこれで今年最後となります。
ニジボックスで球拾いをしています、tack.saitoです。
「エンジニア」と、胸を張って言えなくなりつつあるので記事を書いて心を保ってます。

要件

  • 文字を入れて、確定したタイミングでAPIを叩きたい

ほうほう、簡単だわ。ぐーぐる先生ー。

実装

activity_main.xml
        <EditText
            android:id="@+id/search_edit_text"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:maxLines="1"
            android:inputType="text"
            android:imeOptions="actionSearch"
            android:hint="テキスト..." />
MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.search_edit_text);
        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) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                //未入力はダメ。
                if (TextUtils.isEmpty(s.toString())) {
                    return;
                }
                //確定されたかのチェック
                boolean unfixed = false;
                Object[] spanned = s.getSpans(0, s.length(), Object.class);
                if (spanned != null) {
                    for (Object object : spanned) {
                        if ((s.getSpanFlags(object) & Spanned.SPAN_COMPOSING) == Spanned.SPAN_COMPOSING) {
                            unfixed = true;
                        }
                    }
                }
                if (unfixed) {
                    return;
                }

                //なんか処理を。
                Toast.makeText(MainActivity.this, "確定したよ", Toast.LENGTH_SHORT).show();
            }
        });
    }

へへ、いろんな所に書いてあったぜ!
ありがとうございます〜〜〜!!!
余裕だぜ〜〜 (昨日の俺)

問題発生

  • 英字キーボードだと、確定しても検索しないんだけど??

そんなバナナ。ってか英字キーボードってなんだなんだ〜?

原因

英字キーボードだと、確定したタイミングでafterTextChangedが発火しないことがあるっぽい。
サジェストされた中から選択なら発火するみたい。(変化していれば)
「the」って打って、サジェストされた 「the」を選択しても発火しない模様。
まぁそっか。
日本語に慣れてるから、確定ってTextChanged!!って感じするけど、まぁそりゃそっか。

改修

MainActivity.java
        editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                    // なんか処理
                    Toast.makeText(MainActivity.this, "確定したよ", Toast.LENGTH_SHORT).show();
                }
                return false;
            }
        });

ってわけで、
onTextChangedafterTextChangedに頼らず、
SEARCHボタンを押したら発火するようにしました。(最初っからそれはやっておけって感じですね)

実際は、Toast部分は共通処理で空かチェックしたりして、API叩くような感じにするのかなーと。
いやはや、英字キーボードは触らなかったから気がつかなかったなー。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1