Working with the Soft Keyboard
The Android system shows an on-screen keyboard, known as a soft input method, when a text field in your UI receives focus. To provide the best user experience, you can specify characteristics about the type of input you expect (such as whether it’s a phone number or email address) and how the input method should behave (such as whether it performs auto-correct for spelling mistakes).
Displaying the Soft Keyboard
Device Manager
By default, the emulator routes typing through your computer’s hardware keyboard, so the soft keyboard may never appear on screen. If you want to test with the soft keyboard, open the Device Manager (View => Tool Windows => Device Manager with a project open, or More Actions => Virtual Device Manager from the Welcome screen), click the pencil (edit) icon for your virtual device, click Show Advanced Settings, and uncheck “Enable Keyboard Input” under the Keyboard heading. With hardware keyboard input disabled, the emulator shows the soft keyboard whenever a text field gains focus. Restart the emulator for the change to take effect. See the managing AVDs guide for the full list of AVD configuration properties.
Showing Soft Keyboard Programmatically
The following code will reveal the soft keyboard focused on a specified view:
public void showSoftKeyboard(View view){
if(view.requestFocus()){
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view,InputMethodManager.SHOW_IMPLICIT);
}
}
fun showSoftKeyboard(view: View) {
if (view.requestFocus()) {
val imm: InputMethodManager =
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}
}
Hiding the Soft Keyboard Programmatically
You can force Android to hide the virtual keyboard using the InputMethodManager, calling hideSoftInputFromWindow, passing in the token of the window containing your edit field.
public void hideSoftKeyboard(View view){
InputMethodManager imm =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
fun hideSoftKeyboard(view: View) {
val imm =
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
This will force the keyboard to be hidden in all situations.
Adding a “Done” Key
In the keyboard, you can hide the “Next” key and add “Done” instead by adding the following to the imeOptions for the EditText view:
<EditText
android:imeOptions="actionDone">
</EditText>
or programmatically:
myEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);
myEditText.setImeOptions(EditorInfo.IME_ACTION_DONE)
See the EditText documentation for a more detailed look at imeOptions.
Configuring the Soft Keyboard Mode
The soft keyboard can be configured for each activity within the AndroidManifest.xml file using the android:windowSoftInputMode attribute to adjust both default visibility and also how the keyboard affects the UI when displayed.
Showing the Keyboard when Activity Starts
Although Android gives focus to the first text field in your layout when the activity starts, it does not show the soft keyboard. To show the keyboard when your activity starts, add the android:windowSoftInputMode attribute to the <activity> element with the "stateVisible" value within the Android manifest. Check out this guide for more details. Within the AndroidManifest.xml file:
<activity
android:name="com.example.myactivity"
android:windowSoftInputMode="stateVisible" />
The options for the mode include two aspects: visibility of the keyboard and adjustment of the UI. Visibility options include stateUnchanged, stateHidden, stateVisible and several others listed here.
Changing UI Reaction
The virtual keyboard reduces the amount of space available for your app’s UI. We can also use this same android:windowSoftInputMode property within the <activity> node to change the way that the soft keyboard displays the view elements when appearing within the AndroidManifest.xml file:
<!-- Configures the UI to be resized to make room for the keyboard -->
<activity
android:name="com.example.myactivity"
android:windowSoftInputMode="adjustResize" />
The options for the mode include two aspects: visibility and adjustment. Adjustment options include adjustResize, adjustPan, and adjustUnspecified and are listed in full here. Both visibility and adjustment can be combined with:
<!-- Configures the keyboard to be visible right away and for UI to be resized when shown -->
<activity
android:name="com.example.myactivity"
android:windowSoftInputMode="stateVisible|adjustResize" />
See the guide on keyboard visibility for more details.
Troubleshooting
Toolbar Height Expands on UI Resize
To avoid incorrect Toolbar height calculations, you can add android:fitsSystemWindows="true" (learn more) to the parent layout of the Toolbar. In many cases, this should resolve the issue.