onKeyListener を使用して onKey イベントを取得しています。通常のキーボードで問題なく動作します。ただし、ソフトキーボードでは機能しません。アルファベットではなく数値の onKey イベントしか取得できません。これを解決するための回避策はありますか? どんな種類の助けも大歓迎です。
6 に答える
ソフトウェアキーボードで OnKeyListener が呼び出されるとは思えません。これは、ソフトウェア キーボードが IME デバイスであり、IME デバイスがおそらくキーボード以外のものであることと関係があります。ただし、ハードウェアキーボードを備えた電話でのみ機能するため、 onKeyListener はほとんど役に立たないようです。最近、OnKeyListener を使用する代わりに、アクティビティの EditText フィールドで TextWatcherを使用して、この問題を回避しました。
onKeyListener は、ソフト キーボードを介して Android 1.5 で完全に動作しました
Android 1.6 以降、文字キーと数字キーは onKey イベントを経由しませんが、DEL キーは経由します
もどかしい
これはおそらくばかげていますが、それが現時点での Android の仕組みです。
ドキュメントには、キー イベントはハードウェア キー ストロークに対してのみ伝達され、ソフトウェアには伝達されないと記載されています。
実際、デバイス メーカーは、キー リスナーを介してソフト キーボード イベントを伝播することを思いとどまらせていますが、それを尊重するか、実際にソフト キーボードとハード キーボードを同等の条件で扱うかは完全にメーカー次第です。
Android 4.2.2 以降では、Android システム自体がソフト キーボードのキー ストーク イベントをまったくサポートしないため、メーカーでさえ選択できなくなります。
したがって、ここでの唯一の確実なオプションは、独自の IME (ソフト キーボード) を実装し、キーストロークを自分で処理することです。
TextWatcher は主に主要なリスナーを置き換えるために使用できますが、editText.setText(...); は TextWatcher イベントもトリガーするため、入力されたキーのみに関心がある場合は、おそらく TextWatcher も解決策ではありません。
AutocomleteTextView または EditText で TextWatcher を使用する場合は注意してください。TextWatcher イベント内から AutocompleteTextView / EditText のコンテンツ内のテキストを変更しないでください。そうしないと、無限のイベント/リスニング ループに陥る可能性が高くなります。
これが利用可能なオプションを明確にするのに役立つことを願っていますが、残念ながら実用的な解決策を提供していません.
Google が UI のこの重要な側面を見逃していることに失望しています。
これはデバイス固有のようです。これが Xoom と Acer A100 で動作することを確認できます。ただし、Samsung Galaxy Tab Plus は、文字以外のボタンのイベントのみを発生させます。(ハニカムを実行しているすべてのデバイス)
これを回避するには、リスナーを独自のメソッドに入れて、最初から再度呼び出します。onCreateで、setKeyListenerForEnter();を呼び出します。
次に、方法は次のとおりです。
public void setKeyListenerForEnter(){
final EditText search_entry = (EditText) findViewById(R.id.search_entry);
search_entry.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
getSearchResults(v);
setKeyListenerForEnter();
return true;
}
return false;
}
});
}
これがIMEキーボード自体を処理するよりも優れた解決策であるかどうかはわかりませんが、解決策です。
setFocusableInTouchMode(true); //Enable soft keyboard on touch for target view
setFocusable(true); //Enable hard keyboard to target view
例:
public class CanvasView extends View{
public CanvasView(Context c){
super(c);
//enable keyboard
setOnKeyListener(new KeyBoard());
setFocusable(true);
setFocusableInTouchMode(true);
}
}