Handling physical keyboard's Enter key in SearchView
我在我的应用程序中实现了一个SearchView,当我使用软键盘(使用QueryTextListener)时,当我点击搜索按钮时,它正常工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 | viewHolder.mTextSearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { new SearchForEquipmentTask(false, viewHolder.mTextSearch.getQuery().toString()).execute(); return true; } @Override public boolean onQueryTextChange(String newText) { //Log.d(TAG,"Query:" + newText); return false; } }); |
现在我打算使用物理键盘让我的用户能够使用该应用程序,但我无法弄清楚如何从物理键盘触发搜索事件(onQueryTextChange不会被该键调用)。 当我在Android Studio中运行模拟器时,会发生同样的事情。 我试过了:
1 2 3 4 5 6 7 | viewHolder.mTextSearch.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { Log.d(TAG,"Query:" + keyEvent); return false; } }); |
但是SearchView似乎忽略了任何键的监听器......似乎QueryTextListener是处理搜索的唯一方法,但是如何处理特殊字符呢? 我应该将它切换到更灵活的EditText吗?
任何的想法?
这就是我处理它的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //Grab de EditText from the SearchView EditText editText = (EditText) viewHolder.mTextSearch .findViewById(android.support.v7.appcompat.R.id.search_src_text); editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int keyAction, KeyEvent keyEvent) { if ( //Soft keyboard search keyAction == EditorInfo.IME_ACTION_SEARCH || //Physical keyboard enter key (keyEvent != null && KeyEvent.KEYCODE_ENTER == keyEvent.getKeyCode() && keyEvent.getAction() == KeyEvent.ACTION_DOWN)) { new SearchForEquipmentTask(false, viewHolder.mTextSearch .getQuery().toString()).execute(); return true; } return false; } }); |
谢谢你的帮助!
也可以看看:
- 从SearchView获取EditText元素
- Android:如何让键盘输入按钮说"搜索"并处理其点击?
在布局中,将输入法选项设置为搜索。
1 2 3 | <EditText android:imeOptions="actionSearch" android:inputType="text" /> |
在您的java类中添加编辑器动作侦听器。
1 2 3 4 5 6 7 8 9 | viewHolder.mTextSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH) { performSearch(); return true; } return false; } |
});