こんにちは、僕の記事はこれで今年最後となります。
ニジボックスで球拾いをしています、tack.saitoです。
「エンジニア」と、胸を張って言えなくなりつつあるので記事を書いて心を保ってます。
要件
- 文字を入れて、確定したタイミングでAPIを叩きたい
ほうほう、簡単だわ。ぐーぐる先生ー。
実装
<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="テキスト..." />
@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!!って感じするけど、まぁそりゃそっか。
改修
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;
}
});
ってわけで、
onTextChanged
やafterTextChanged
に頼らず、
SEARCHボタンを押したら発火するようにしました。(最初っからそれはやっておけって感じですね)
実際は、Toast部分は共通処理で空かチェックしたりして、API叩くような感じにするのかなーと。
いやはや、英字キーボードは触らなかったから気がつかなかったなー。