今天在过程中遇到了关于Android软件盘的问题,点击输入框,目前弹出键盘会挡住输入框,需要手动上移页面,这样的app可能会给用户带来不便.因此对软键盘进行优化,然后一顿百度,最后找到解决方案,其实关于软键盘的解决都在在AndroidManifest.xml文件中界面对应的<activity>里设置windowSoftInputMode属性即可,下面把踩过的坑分享给大家,避免大家在踩坑坑哦!!!
先说键盘遮挡输入框的问题,在AndroidManifest.xml中添加 android:windowSoftInputMode="adjustPan|stateHidden"即可
<activity
android:windowSoftInputMode="adjustPan|stateHidden"
android:name=".ui.activity.DeviceEditActivity"
android:screenOrientation="portrait" />
下面把更多关于windowSoftInputMode属性内部各个值的含义分享给大家:
stateUnspecified
:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
stateUnchanged
:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
stateHidden
:用户选择activity时,软键盘总是被隐藏
stateAlwaysHidden
:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
stateVisible
:软键盘通常是可见的
stateAlwaysVisible
:用户选择activity时,软键盘总是显示的状态
adjustUnspecified
:默认设置,通常由系统自行决定是隐藏还是显示
adjustResize
:该Activity总是调整屏幕的大小以便留出软键盘的空间
adjustPan
:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
例如:
AndroidManifest.xml文件中界面对应的<activity>里加入
android:windowSoftInputMode="adjustPan" 键盘就会覆盖屏幕
android:windowSoftInputMode="stateVisible|adjustResize" 屏幕整体上移
android:windowSoftInputMode="adjustPan|stateHidden" 软键盘弹出,界面布局不变,这是解决弹出软键盘,界面整体被压缩的方式
如果是下拉列表请选择的情况,则直接动态将软键盘隐藏
// llRole任意给控件即可,一般对应写入,不可为空 KeyboardUtil是一个软键盘工具类
KeyboardUtil.hideKeyboard(llRole);
软键盘工具类代码如下:
/**
* 软键盘工具类
*/
public class KeyboardUtil {
public static void showKeyboard(final View view) {
view.requestFocus();
InputMethodManager inputManager =
(InputMethodManager) view.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(view, 0);
}
public static void hideKeyboard(final View view) {
InputMethodManager imm =
(InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
public static boolean isKeyBoardActive(final Context context) {
//获取当屏幕内容的高度
int screenHeight = ((Activity)context).getWindow().getDecorView().getHeight();
//获取View可见区域的bottom
Rect rect = new Rect();
//DecorView即为activity的顶级view
((Activity)context).getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
//考虑到虚拟导航栏的情况(虚拟导航栏情况下:screenHeight = rect.bottom + 虚拟导航栏高度)
//选取screenHeight*2/3进行判断
return screenHeight*2/3 > rect.bottom;
}
}
网友评论