1.显示键盘

1
2
3
4
5
6
7
et_text.requestFocus();
et_text.post(new Runnable() {
@Override
public void run() {
((InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(et_text, 0);
}
});

2.隐藏键盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private InputMethodManager inputManager;//软键盘控制器
inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (activity.getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
if (activity.getCurrentFocus() != null )
inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
}));

有用到键盘的地方,常常会出现View被键盘挡住的现象,解决办法如下:


  • adjustResize 调整键盘保证其显示
  • adjustPan 移动界面保证界面底部显示

1.代码实现View的addOnGlobalLayoutListener接口,监听键盘高度并重新布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* @param root 最外层布局,需要调整的布局
* @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部
*/
private void controlKeyboardLayout(final View root, final View scrollToView) {
root.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
//获取root在窗体的可视区域
root.getWindowVisibleDisplayFrame(rect);
//获取root在窗体的不可视区域高度(被其他View遮挡的区域高度)
int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
//若不可视区域高度大于100,则键盘显示
if (rootInvisibleHeight > 100) {
int[] location = new int[2];
//获取scrollToView在窗体的坐标
scrollToView.getLocationInWindow(location);
//计算root滚动高度,使scrollToView在可见区域
int srollHeight = (location[1] + scrollToView.getHeight()) - rect.bottom;
root.scrollTo(0, srollHeight);
} else {
//键盘隐藏
root.scrollTo(0, 0);
}
}
});
}

此方法有时会出现界面跳动的bug

2.对于一般的Activity,直接在AndroidMainfest.xml中配置

android:windowSoftInputMode=”adjustResize”
一般可解决问题

3.对于设置过透明状态栏(android4.4)的界面,一般容易出现输入框有一部分被挡住的情况

这时需在ListView、RecyclerView的父布局上设置
android:fitsSystemWindows=”true”