原文位置:Training > Best Practices for User Input > Handling Keyboard Input > Handling Input Method Visibility
原文地址:https://developer.android.com/training/keyboard-input/visibility.html#ShowOnStart
当可编辑文本区域获得或失去焦点,安卓会适当的显示或隐藏输入法(在屏幕上弹出的键盘)。
通常系统决定界面和文本区域在输入法上方如何展现。例如,当屏幕上垂直方向空间受限时,
文本区域应该在弹出键盘上方填充所有空间,绝大多数app适合用这种方法。
有些时候,你可能想更多的直接控制输入法的显示和当键盘弹出时按照你的想法指定你的布局。这节课解释
如何控制和响应输入法显示。
当activity开启时显示输入法
虽然当activity开启时安卓会让布局中第一个文本编辑区域获得焦点,但是不会显示输入法。输入内容可能在
activity中不是主要任务所以不弹出键盘是适当的。尽管如此,如果输入内容是主要的任务(例如登录页面),有可能需要键盘默认弹出。
当activity开启时需要显示输入法,增加 android:windowSoftInputMode属性在<activity>中并且属性指定“stateVisible”。
例如
<application ... >
<activity
android:windowSoftInputMode="stateVisible" ... >
...
</activity>
...
</application>
提示:如何用户的设备有硬键盘,软键盘将不会出现
有需要的时候显示输入法
如果在你的activity某个生命周期方法中你想让输入法可见,你可以使用InputMethodManager去显示
例如,下面的方法传入你想输入内容的view,调用requestFocus()获取焦点,然后showSoftInput()打开输入法:
public void showSoftKeyboard(View view) {
if (view.requestFocus()) {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}
提示:一旦输入法显示,你不能通过代码方式隐藏。系统会隐藏输入法当用户完成文本区域的任务或者用户可以用系统控制隐藏(例如后退键)
指定你的界面如何响应
当输入法出现在屏幕上,它会减少你app界面的显示空间。系统决定如何来调整你界面可见部分,有可能不会正确显示。
如果想让你的app能更好的显示,你应该以你想要的方式来指定系统在可用空间如何展示你的界面。
在一个activity中明确你首选的方案,用属性 android:windowSoftInputMode 在配置文件的<activity>标签中指定一个“adjust”的值。
例如:保证系统调整你的布局到可用空间-确保所有你的布局内容都是可用的(即使需要滚动)-使用“adjustResize”
<application ... >
<activity
android:windowSoftInputMode="adjustResize" ... >
...
</activity>
...
</application>
你可以综合以上指定的属性初始化键盘的是否可见:
<activity
android:windowSoftInputMode="stateVisible|adjustResize" ... >
...
</activity>
指定"adjustResize"是重要的如果在你的界面中用户在输入后或者输入的时候需要马上访问。例如,如果你使用
相对布局放了一个按钮条在屏幕最下方,用"adjustResize"调整布局让按钮条可以不被输入法遮挡。
补充内容:android:windowSoftInputMode属性
stateUnspecified:软键盘的状态(隐藏还是显示)未指定。系统会参考主题的设置选择合适的状态。这个是软键盘的默认设置。
stateUnchanged:软键盘保持上次的状态,不管是显示还是隐藏,当进入activity之前。
stateHidden:当用户选择此activity时键盘隐藏,当用户主动导航进入此activity而不是在另一个activity中退回到这个activity
stateAlwaysHidden:软键盘一直隐藏当activity主窗口获取到输入焦点时
stateVisible:软键盘显示(当用户导航进入activity主窗口)
stateAlwaysVisible:软键盘显示当用户选择此activity,当用户主动导航进入这个activity而不因为离另一个activity回退到此activity
adjustUnspecified:不指定主窗口是否调整大小给软键盘腾出空间,或者是否移动窗口内容让当前焦点可见。
系统根据窗口是否包含可以滚动其内容的控件自动选择这些模式中的一个。如果有可以滚动的view,
假设滚动可以使窗口的所有内容在一个小区域中都可见,那么窗口将会调整大小。
这是主窗口的默认设置。
adjustResize:activity的主窗口总是会调整大小在屏幕上给键盘腾出空间
adjustPan:activity的主窗口不调整大小给键盘腾出空间。而是窗口的内容自动滚动使当前焦点不被键盘遮挡用户可以看到自己的输入内容。
这个通常没有调整大小理想,因为用户可能需要关闭软键盘来操作遮挡的部分。