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
以及View
或Window
。
我已经创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.xml
的windowSoftInputMode
属性设置为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
调用EditText
的IME_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应用程序可以可靠地:
- 暂时隐藏键盘。 当用户聚焦一个新的文本字段时,它会再次出现。
- 当活动开始时显示键盘,并在活动上设置一个标志,指示他们的键盘应始终可见。 此标志只能在活动初始化时设置。
- 将活动标记为永不显示或允许使用键盘。 此标志只能在活动初始化时设置。
对我而言,暂时隐藏键盘是不够的。 在某些设备上,只要重点关注新的文本字段,它就会重新出现。 由于我的应用程序在一个页面上使用多个文本字段,所以将焦点放在新的文本字段上将导致隐藏的键盘再次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).