//调用方式,在所要监听的Activity onCreate()加入如下代码
SoftHideKeyBoardUtil.assistActivity(this);
public class SoftHideKeyBoardUtil {
private final Activity mActivity;
private int mScreenHeight;
private boolean isFirst;
public static void assistActivity(Activity activity) {
new SoftHideKeyBoardUtil(activity);
}
private SoftHideKeyBoardUtil(Activity activity) {
mActivity = activity;
activity.getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null && imm.isActive()) {
View view = mActivity.getWindow().getDecorView().findFocus();
if (view != null && view instanceof EditText) {
NestedScrollView nestedScrollView = getNestedScrollView(view);
if (nestedScrollView == null) {
ScrollView scrollView = getScrollView(view);
if (scrollView != null && !isFirst) {
isFirst = true;
ViewGroup.LayoutParams layoutParams = scrollView.getLayoutParams();
layoutParams.height = (int) (scrollView.getHeight() - view.getX() - view.getHeight());
scrollView.setLayoutParams(layoutParams);
} else {
isFirst = false;
}
} else if (!isFirst) {
isFirst = true;
ViewGroup.LayoutParams layoutParams = nestedScrollView.getLayoutParams();
layoutParams.height = (int) (nestedScrollView.getHeight() - view.getX() - view.getHeight());
nestedScrollView.setLayoutParams(layoutParams);
} else {
isFirst = false;
}
}
}
}
});
}
private ScrollView getScrollView(View view) {
if (view.getParent() instanceof ScrollView) {
return (ScrollView) view.getParent();
}
if (view.getParent().equals(view.getRootView())) {
return null;
}
return getScrollView((View) view.getParent());
}
private NestedScrollView getNestedScrollView(View view) {
if (view.getParent() instanceof NestedScrollView) {
return (NestedScrollView) view.getParent();
}
if (view.getParent().equals(view.getRootView())) {
return null;
}
return getNestedScrollView((View) view.getParent());
}
private EditText getFocusEditText() {
for (EditText editText : mEditTexts) {
if (editText.isFocused()) {
return editText;
}
}
return null;
}
List<EditText> mEditTexts = new ArrayList<>();
private int getScreenHeight() {
if (mScreenHeight > 0) {
return mScreenHeight;
}
mScreenHeight = ((WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getHeight();
return mScreenHeight;
}
}
说下实现思路,获得ViewTreeObserver然后addOnGlobalLayoutListener该listener在每次布局变化时(如键盘的显示隐藏,布局高度的更改)调用,当在回调时,是指获得焦点的editText外层的scrollView高度变为原高度减掉该editText以下的部分,就实现了输入法总在editText下面