Android Keyboard Part 4: Showing and Hiding
Now it’s time for the final part of my Android Keyboard series, and one of the most challenging parts of UI development: showing and hiding the keyboard. What seems like a simple task can often become very complicated, but I’ll show some examples of how to get the behavior you want, and explain some of the weirdness we see along the way.
Input Method Manager
At the heart of all of this is the InputMethodManager, Android’s one-stop-shop for any programmatic keyboard features.
InputMethodManager
is responsible for the interaction between you app and whatever InputMethod (keyboard) the user’s phone is configured to use. Most of the communication to handle things like key presses, IME Actions, and switching text fields is handle automatically, so I won’t talk about it here.
We’re only interested in two methods right now:
showSoftInput(View view, int flags)
hideSoftInputFromWindow(IBinder windowToken, int flags)
Those two will cover 99% of your keyboard needs, so let’s look into them a bit more.
Showing the keyboard
As you might have guessed, InputMethodManager#showSoftInput
is for showing the soft keyboard.
It takes in a View
and an integer representing a set of bit flags.
The View
should be the EditText
that you want the user to start typing in.
Note that the keyboard won’t appear unless that EditText
is currently in focus!
The integer parameter allows you to specify whether the keyboard is being shown implicitly, or as a result of user action. Setting it to 0 works fine.
There are three steps here:
- Get the
InputMethodManager
from theActivity
- Make sure that the specified view has focus, or else the keyboard won’t appear
- Call
showSoftInput
with the view and all flags set to 0
And that’s it!
Hiding the Keyboard
Hiding the keyboard follows a pretty similar pattern. InputMethodManager#hideSoftInputFromWindow
takes an IBinder
and another set of integer flags.
You might think that Android would just let you close the keyboard, but you have to provide an IBinder
from an active View
for security purposes.
IBinder
tokens are unique across the entire operating system, and Android uses them to make sure apps can’t close a keyboard that’s being used by another process.
Just like with showing the keyboard, the set of integer flags allows you to tell the operating system if the keyboard is being closed implicitly or by the user. This can safely be set to 0.
Here we get the IBinder
by calling view.getWindowToken()
on any active view.
That’s all you have to do! I hope you got a lot out of this keyboard series, and now it’s time to add these great features to your own apps.