closures/隐藏Android软键盘

我在我的布局中有一个EditText和一个Button

在编辑字段中写入并单击Button ,我想要隐藏虚拟键盘。 我假设有一个简单的一行或两行代码来实现这一点。

我在哪里可以find它的一个例子?

您可以强制Android使用InputMethodManager隐藏虚拟键盘,调用hideSoftInputFromWindow ,传入含有焦点视图的窗口标记。

 // Check if no view has focus: View view = this.getCurrentFocus(); if (view != null) { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } 

这将迫使键盘在所有情况下被隐藏。 在某些情况下,您将希望传入InputMethodManager.HIDE_IMPLICIT_ONLY作为第二个参数,以确保在用户没有显式强制显示时(通过按住菜单)只隐藏键盘。

为了澄清这个疯狂,我想首先代表所有的Android用户道歉,对于Google对软键盘的彻头彻尾的处理。 对于同样简单的问题,有很多答案各不相同的原因是因为这个API与Android中的许多其他API一样,是非常可怕的devise。 我可以想到没有礼貌的方式说出来。

我想隐藏键盘。 我期望为Android提供以下语句: Keyboard.hide() 。 结束。 非常感谢你。 但Android有一个问题。 您必须使用InputMethodManager来隐藏键盘。 好的,好吧,这是Android的键盘的API。 但! 您需要有一个Context才能访问IMM。 现在我们有一个问题。 我可能想隐藏一个静态或实用工具类没有任何使用或需要任何Context的键盘。 或者更糟的是,IMM要求您指定要隐藏键盘FROM的什么View (或者甚至更糟糕的是哪个Window )。

这就是隐藏键盘如此具有挑战性的原因。 亲爱的Google:当我正在查找蛋糕食谱时,地球上没有RecipeProvider会拒绝为我提供配方,除非我第一次回答WHO,蛋糕将被吃掉,并在那里被吃掉!

这个悲惨的故事以丑陋的真相结束:为了隐藏Android键盘,您将被要求提供两种识别forms: Context以及ViewWindow

我已经创build了一个静态实用程序方法,可以非常可靠地完成这项工作,只要您从一个Activity调用它。

 public static void hideKeyboard(Activity activity) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); //Find the currently focused view, so we can grab the correct window token from it. View view = activity.getCurrentFocus(); //If no view currently has focus, create a new one, just so we can grab a window token from it if (view == null) { view = new View(activity); } imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } 

请注意,此实用程序方法只能在从Activity调用时才能使用! 上述方法调用目标Activity getCurrentFocus来获取正确的窗口标记。

但是,假设你想隐藏在一个DialogFragment托pipe的EditText的键盘? 你不能使用上面的方法:

 hideKeyboard(getActivity()); //won't work 

这是行不通的,因为你会传递一个对Fragment的主机Activity的引用,当Fragment被显示的时候,这个引用将没有集中控制! 哇! 所以,为了把键盘从碎片中隐藏起来,我使用了更低级的,更常见的和丑陋的:

 public static void hideKeyboardFrom(Context context, View view) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } 

下面是一些额外的信息,从更多的时间收集浪费追逐这个解决scheme:

关于windowSoftInputMode

还有一点要注意。 默认情况下,Android会自动将初始焦点分配给Activity的第一个EditText或可聚焦控件。 自然而然,InputMethod(通常是软键盘)将通过显示自身来响应焦点事件。 AndroidManifest.xmlwindowSoftInputMode属性设置为stateAlwaysHidden ,会指示键盘忽略此自动分配的初始焦点。

 <activity android:name=".MyActivity" android:windowSoftInputMode="stateAlwaysHidden"/> 

几乎令人难以置信的是,当你触摸控件时(除非focusable="false"和/或focusableInTouchMode="false"被分配给控件),它似乎什么都不能阻止键盘打开。 显然,windowSoftInputMode设置仅适用于自动焦点事件,而不是焦点触摸事件触发的事件。

因此, stateAlwaysHidden确实的命名非常糟糕。 它也许应该被称为ignoreInitialFocus

希望这可以帮助。


更新:获取窗口令牌的更多方法

如果没有专注的视图(例如,如果您只是更改了片段,则可能会发生),还有其他视图将提供有用的窗口标记。

这些是替代上述代码if (view == null) view = new View(activity); 这些没有明确提到你的活动。

在片段类里面:

 view = getView().getRootView().getWindowToken(); 

给定一个片段fragment作为参数:

 view = fragment.getView().getRootView().getWindowToken(); 

从您的内容主体开始:

 view = findViewById(android.R.id.content).getRootView().getWindowToken(); 

更新2:清除焦点以避免再次显示键盘,如果您从后台打开应用程序

将此行添加到方法的末尾:

view.clearFocus();

隐藏软键盘也是有用的:

 getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN ); 

这可以用来抑制软键盘,直到用户实际触摸editText视图为止。

我还有一个解决scheme来隐藏键盘:

 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 

这里在HIDE_IMPLICIT_ONLY的位置传递HIDE_IMPLICIT_ONLY ,在HIDE_IMPLICIT_ONLY的位置showFlag 0 。 它会强制closures软键盘。

Meier的解决scheme也适用于我。 在我的情况下,我的应用程序的顶级是一个tabHost,我想在切换标签时隐藏关键字 – 我从tabHost视图获得窗口标记。

 tabHost.setOnTabChangedListener(new OnTabChangeListener() { public void onTabChanged(String tabId) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0); } } 

请在oncreate ()中尝试下面的代码

 EditText edtView=(EditText)findViewById(R.id.editTextConvertValue); edtView.setInputType(0); 

更新:我不知道为什么这个解决scheme不再工作(我刚testingAndroid 23)。 请使用Saurabh Pareek的解决scheme。 这里是:

 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); //Hide: imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); //Show imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); 

老答案:

 //Show soft-keyboard: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); //hide keyboard : getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
 protected void hideSoftKeyboard(EditText input) { input.setInputType(0); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(input.getWindowToken(), 0); } 

如果这里所有的其他答案都不适合你,那么还有另一种手动控制键盘的方法。

创build一个function,将pipe理一些EditText的属性:

 public void setEditTextFocus(boolean isFocused) { searchEditText.setCursorVisible(isFocused); searchEditText.setFocusable(isFocused); searchEditText.setFocusableInTouchMode(isFocused); if (isFocused) { searchEditText.requestFocus(); } } 

然后,确保EditText onFocus打开/closures键盘:

 searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (v == searchEditText) { if (hasFocus) { // Open keyboard ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED); } else { // Close keyboard ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0); } } } }); 

现在,只要你想打开键盘手动调用:

 setEditTextFocus(true); 

结束通话:

 setEditTextFocus(false); 

Saurabh Pareek迄今为止已经是最好的答案。

不过也可以使用正确的标志。

 /* hide keyboard */ ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE)) .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); /* show keyboard */ ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE)) .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); 

实际使用的例子

 /* click button */ public void onClick(View view) { /* hide keyboard */ ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE)) .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); /* start loader to check parameters ... */ } /* loader finished */ public void onLoadFinished(Loader<Object> loader, Object data) { /* parameters not valid ... */ /* show keyboard */ ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE)) .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); /* parameters valid ... */ } 

从这么search,在这里我find了一个适合我的答案

 // Show soft-keyboard: InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); // Hide soft-keyboard: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

简短的回答

在您的OnClick侦听器中使用onEditorAction调用EditTextIME_ACTION_DONE

 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE) } }); 

下钻

我觉得这种方法更好,更简单,更符合Android的devise模式。 在上面的简单示例中(通常在大多数常见情况下),您将拥有一个具有/有焦点的EditText ,并且通常也是首先调用键盘的EditText (它绝对能够在许多常见的情况)。 以同样的方式, 应该是释放键盘的那个,通常可以通过ImeAction来完成。 只要看看一个带有android:imeOptions="actionDone"EditText如何运作的,你想用相同的方法来达到同样的效果。


检查这个相关的答案

这应该工作:

 public class KeyBoard { public static void show(Activity activity){ InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show } public static void hide(Activity activity){ InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide } public static void toggle(Activity activity){ InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); if (imm.isActive()){ hide(activity); } else { show(activity); } } } KeyBoard.toggle(activity); 

我正在使用自定义键盘来input一个hex数字,所以我不能有IMM键盘显示…

在v3.2.4_r1中, setSoftInputShownOnFocus(boolean show)被添加来控制天气,或者当TextView获得焦点时不显示键盘,但是仍然隐藏所以必须使用reflection:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { try { Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class); method.invoke(mEditText, false); } catch (Exception e) { // Fallback to the second method } } 

对于旧版本,我用一个OnGlobalLayoutListener得到了非常好的结果(但是还不够完美),并且在我的根视图中添加了一个ViewTreeObserver ,然后检查键盘是否显示如下:

 @Override public void onGlobalLayout() { Configuration config = getResources().getConfiguration(); // Dont allow the default keyboard to show up if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0); } } 

最后一个解决scheme可能会显示键盘一秒钟,并与select手柄混乱。

当键盘进入全屏时,onGlobalLayout不被调用。 为了避免这种情况,请使用TextView#setImeOptions(int)或在TextView XML声明中:

 android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi" 

更新:刚刚发现什么对话框使用永远不会显示键盘和工作在所有版本:

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 
 public void setKeyboardVisibility(boolean show) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(show){ imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); }else{ imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0); } } 

除此之外,如果您想从任何地方closures软键盘而无需引用用于打开键盘的(EditText)字段,但仍然希望在字段集中的情况下执行该操作,则可以使用这个(来自一个Activity):

 if (getCurrentFocus() != null) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } 

我已经花了两天多的时间来处理线程中发布的所有解决scheme,并且发现他们缺乏这种或那种方式。 我确切的要求是有一个100%可靠性的button显示或隐藏屏幕上的键盘。 当键盘处于隐藏状态时不应该再次出现,不pipe用户点击什么input字段。 当它处于可见状态时,无论用户点击什么button,键盘都不应该消失。 这需要在Android 2.2+上一直工作到最新的设备。

你可以在我的应用程序干净的RPN中看到这个工作的实现。

在许多不同的手机(包括Froyo姜饼装置)上testing了许多build议的答案之后,很明显Android应用程序可以可靠地:

  1. 暂时隐藏键盘。 当用户聚焦一个新的文本字段时,它会再次出现。
  2. 当活动开始时显示键盘,并在活动上设置一个标志,指示他们的键盘应始终可见。 此标志只能在活动初始​​化时设置。
  3. 将活动标记为永不显示或允许使用键盘。 此标志只能在活动初始​​化时设置。

对我而言,暂时隐藏键盘是不够的。 在某些设备上,只要重点关注新的文本字段,它就会重新出现。 由于我的应用程序在一个页面上使用多个文本字段,所以将焦点放在新的文本字段上将导致隐藏的键盘再次popup。

不幸的是,列表中的项目2和3仅在活动开始时才起作用。 一旦活动变得可见,您不能永久隐藏或显示键盘。 诀窍是当用户按下键盘切换button时,实际上重新启动您的活动。 在我的应用程序中,当用户按下切换键盘button时,下面的代码运行:

 private void toggleKeyboard(){ if(keypadPager.getVisibility() == View.VISIBLE){ Intent i = new Intent(this, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); Bundle state = new Bundle(); onSaveInstanceState(state); state.putBoolean(SHOW_KEYBOARD, true); i.putExtras(state); startActivity(i); } else{ Intent i = new Intent(this, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); Bundle state = new Bundle(); onSaveInstanceState(state); state.putBoolean(SHOW_KEYBOARD, false); i.putExtras(state); startActivity(i); } } 

这会导致当前活动将其状态保存到一个Bundle ,然后启动该活动,并通过一个布尔值来指示该键盘是显示还是隐藏。

onCreate方法里面运行下面的代码:

 if(bundle.getBoolean(SHOW_KEYBOARD)){ ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0); getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } else{ getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); } 

如果应显示软键盘,则会通知InputMethodManager显示键盘,并指示窗口始终可见软input。 如果软键盘应该隐藏,则设置WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM

这种方法可以在我testing过的所有设备上可靠运行 – 从运行android 2.2的4岁的HTC手机到运行4.2.2的nexus 7。 这种方法的唯一缺点是你需要小心处理后退button。 由于我的应用程序本质上只有一个屏幕(它的计算器),我可以覆盖onBackPressed()并返回到设备的主屏幕。

感谢这个答案 ,我得到了以下的东西,在我的情况下,在浏览ViewPager的片段时很好地工作…

 private void hideKeyboard() { // Check if no view has focus: View view = this.getCurrentFocus(); if (view != null) { InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } private void showKeyboard() { // Check if no view has focus: View view = this.getCurrentFocus(); if (view != null) { InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); } } 

Above answers work for different scenario's but If you want to hide the keyboard inside a view and struggling to get the right context try this:

 setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { hideSoftKeyBoardOnTabClicked(v); } } private void hideSoftKeyBoardOnTabClicked(View v) { if (v != null && context != null) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } 

and to get the context fetch it from constructor:)

 public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; init(); } 

If you want to close the soft keyboard during a unit or functional test, you can do so by clicking the "back button" from your test:

 // Close the soft keyboard from a Test getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 

I put "back button" in quotes, since the above doesn't trigger the onBackPressed() for the Activity in question. It just closes the keyboard.

Make sure to pause for a little while before moving on, since it takes a little while to close the back button, so subsequent clicks to Views, etc., won't be registered until after a short pause (1 second is long enough ime).

Here's how you do it in Mono for Android (AKA MonoDroid)

 InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager; if (imm != null) imm.HideSoftInputFromWindow (searchbox.WindowToken , 0); 

This worked for me for all the bizarre keyboard behavior

 private boolean isKeyboardVisible() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. mRootView.getWindowVisibleDisplayFrame(r); int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top); return heightDiff > 100; // if more than 100 pixels, its probably a keyboard... } protected void showKeyboard() { if (isKeyboardVisible()) return; InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (getCurrentFocus() == null) { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } else { View view = getCurrentFocus(); inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED); } } protected void hideKeyboard() { if (!isKeyboardVisible()) return; InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); View view = getCurrentFocus(); if (view == null) { if (inputMethodManager.isAcceptingText()) inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0); } else { if (view instanceof EditText) ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } 

Add to your activity android:windowSoftInputMode="stateHidden" in Manifest file. 例:

 <activity android:name=".ui.activity.MainActivity" android:label="@string/mainactivity" android:windowSoftInputMode="stateHidden"/> 

For my case, I was using the a SearchView in the actionbar. After a user performs a search, the keyboard would pop open again.

Using the InputMethodManager did not close the keyboard. I had to clearFocus and set the focusable of the search view to false:

 mSearchView.clearFocus(); mSearchView.setFocusable(false); 

用这个

 this.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

I have almost tried all of these answers, I had some random issues especially with the samsung galaxy s5.

What I end up with is forcing the show and hide, and it works perfectly:

 /** * Force show softKeyboard. */ public static void forceShow(@NonNull Context context) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } /** * Force hide softKeyboard. */ public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) { if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) { editText.requestFocus(); } InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); } 

Simple and Easy to use method, just call hideKeyboardFrom(YourActivity.this); to hide keyboard

 /** * This method is used to hide keyboard * @param activity */ public static void hideKeyboardFrom(Activity activity) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); } 

Just use this optimized code in your activity:

 if (this.getCurrentFocus() != null) { InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } 

I have the case, where my EditText can be located also in an AlertDialog , so the keyboard should be closed on dismiss. The following code seems to be working anywhere:

 public static void hideKeyboard( Activity activity ) { InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE ); View f = activity.getCurrentFocus(); if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) ) imm.hideSoftInputFromWindow( f.getWindowToken(), 0 ); else activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN ); } 

You could also look into using setImeOption on the EditText.

I just had a very simular situation where my layout contained an EditText and a search button. When I discovered I could just set the ime option to "actionSearch" on my editText, I realized I didn't even need a search button anymore. The soft keyboard (in this mode) has a search icon, which can be used to kick off the search (and the keyboard closes itself as you would expect).