I have an EditText
and a Button
in my layout.
After writing in the edit field and clicking on the Button
, I want to hide the virtual keyboard. I assume that this is a simple piece of code, but where can I find an example of it?
I have an EditText
and a Button
in my layout.
After writing in the edit field and clicking on the Button
, I want to hide the virtual keyboard. I assume that this is a simple piece of code, but where can I find an example of it?
I have spent more than two days working through all of the solutions posted in the thread and have found them lacking in one way or another. My exact requirement is to have a button that will with 100% reliability show or hide the on screen keyboard. When the keyboard is in its hidden state is should not re-appear, no matter what input fields the user clicks on. When it is in its visible state the keyboard should not disappear no matter what buttons the user clicks. This needs to work on Android 2.2+ all the way up to the latest devices.
You can see a working implementation of this in my app clean RPN.
After testing many of the suggested answers on a number of different phones (including froyo and gingerbread devices) it became apparent that android apps can reliably:
For me, temporarily hiding the keyboard is not enough. On some devices it will re-appear as soon as a new text field is focused. As my app uses multiple text fields on one page, focusing a new text field will cause the hidden keyboard to pop back up again.
Unfortunately item 2 and 3 on the list only work reliability when an activity is being started. Once the activity has become visible you cannot permanently hide or show the keyboard. The trick is to actually restart your activity when the user presses the keyboard toggle button. In my app when the user presses on the toggle keyboard button, the following code runs:
This causes the current activity to have its state saved into a Bundle, and then the activity is started, passing through an boolean which indicates if the keyboard should be shown or hidden.
Inside the onCreate method the following code is run:
If the soft keyboard should be shown, then the InputMethodManager is told to show the keyboard and the window is instructed to make the soft input always visible. If the soft keyboard should be hidden then the WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM is set.
This approach works reliably on all devices I have tested on - from a 4 year old HTC phone running android 2.2 up to a nexus 7 running 4.2.2. The only disadvantage with this approach is you need to be careful with handling the back button. As my app essentially only has one screen (its a calculator) I can override onBackPressed() and return to the devices home screen.
Please try this below code in
onCreate()
To help clarify this madness, I'd like to begin by apologizing on behalf of all Android users for Google's downright ridiculous treatment of the soft keyboard. The reason there are so many answers, each different, for the same simple question because this API, like many others in Android, is horribly designed. I can think of no polite way to state it.
I want to hide the keyboard. I expect to provide Android with the following statement:
Keyboard.hide()
. The end. Thank you very much. But Android has a problem. You must use theInputMethodManager
to hide the keyboard. OK, fine, this is Android's API to the keyboard. BUT! You are required to have aContext
in order to get access to the IMM. Now we have a problem. I may want to hide the keyboard from a static or utility class that has no use or need for anyContext
. or And FAR worse, the IMM requires that you specify whatView
(or even worse, whatWindow
) you want to hide the keyboard FROM.This is what makes hiding the keyboard so challenging. Dear Google: When I'm looking up the recipe for a cake, there is no
RecipeProvider
on Earth that would refuse to provide me with the recipe unless I first answer WHO the cake will be eaten by AND where it will be eaten!!This sad story ends with the ugly truth: to hide the Android keyboard, you will be required to provide 2 forms of identification: a
Context
and either aView
or aWindow
.I have created a static utility method which can do the job VERY solidly, provided you call it from an
Activity
.Be aware that this utility method ONLY works when called from an
Activity
! The above method callsgetCurrentFocus
of the targetActivity
to fetch the proper window token.But suppose you want to hide the keyboard from an
EditText
hosted in aDialogFragment
? You can't use the method above for that:This won't work because you'll be passing a reference to the
Fragment
's hostActivity
, which will have no focused control while theFragment
is shown! Wow! So, for hiding the keyboard from fragments, I resort to the lower-level, more common, and uglier:Below is some additional information gleaned from more time wasted chasing this solution:
About windowSoftInputMode
There's yet another point of contention to be aware of. By default, Android will automatically assign initial focus to the first
EditText
or focusable control in yourActivity
. It naturally follows that the InputMethod (typically the soft keyboard) will respond to the focus event by showing itself. ThewindowSoftInputMode
attribute inAndroidManifest.xml
, when set tostateAlwaysHidden
, instructs the keyboard to ignore this automatically-assigned initial focus.Almost unbelievably, it appears to do nothing to prevent the keyboard from opening when you touch the control (unless
focusable="false"
and/orfocusableInTouchMode="false"
are assigned to the control). Apparently, the windowSoftInputMode setting applies only to automatic focus events, not to focus events triggered by touch events.Therefore,
stateAlwaysHidden
is VERY poorly named indeed. It should perhaps be calledignoreInitialFocus
instead.Hope this helps.
UPDATE: More ways to get a window token
If there is no focused view (e.g. can happen if you just changed fragments), there are other views that will supply a useful window token.
These are alternatives for the above code
if (view == null) view = new View(activity);
These don't refer explicitly to your activity.Inside a fragment class:
Given a fragment
fragment
as a parameter:Starting from your content body:
UPDATE 2: Clear focus to avoid showing keyboard again if you open the app from the background
Add this line to the end of the method:
view.clearFocus();
Thanks to this SO answer, I derived the following which, in my case, works nicely when scrolling through the the fragments of a ViewPager...
In some cases this methods can works except of all others. This saves my day :)
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: