AndroidManifest中可以配置:
android:windowSoftInputMode="adjustResize"
或者adjustPan
,
类似的:在Activity或者Fragment的onCreate里面,调用
SOFT_INPUT_ADJUST_NOTHING: 不调整(输入法完全直接覆盖住);
SOFT_INPUT_ADJUST_PAN:把整个Layout顶上去露出获得焦点的EditText,不压缩多余空间
SOFT_INPUT_ADJUST_RESIZE: 整个Layout重新编排,重新分配多余空间;
SOFT_INPUT_ADJUST_UNSPECIFIED: 系统自己根据内容自行选择上两种方式的一种执行(默认配置).
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_XXX)
来代替。
二者效果相同,代码中优先生效。
stateHidden等属性忽略介绍。他们不影响大局,只是键盘出来的方式和常驻状态。通过|
符号来或进去即可。
-
adjustResize
实际效果:当键盘弹出,window整体高度变小,activity Layout高度变少。
坑点:
整体布局是ConstraintLayout,设计了一个基于底部marginBottom的button,那么,这个按钮他就会自动被顶起,不符合预期。反而界面中的输入框并没有变动?
需要改成NestedScrollView能够呈现。 -
adjustPan
实际效果:当键盘弹出,整体布局向上顶。就像摇窗帘向上。这也是英文pan的含义,摇摄,引申为平移。
坑点1:
由于输入法带边框背景,始终被遮住一点点边框。https://stackoverflow.com/questions/43798466/android-edittext-was-not-completely-visible-when-keyboard-appears android:layout_height="match_parent" or android:layout_height="wrap_content" wrap_content
有效。然而,我的输入框不可能就这么矮吧?设置个minHight又没效了。
坑点2:
带有WebView的activity使用了全屏模式或者adjustPan模式。
键盘无法处理。
综合了别的帖子和自己的实践总结备用:
1. 普通Activity(不带WebView) :
1.1 adjustPan
能接受,就是顶起有点不够,总是边框有点覆盖,即使是NestedScrollView中。80分。推荐指数 ※※
1.2 adjustResize
a) 如果布局是死布局,则不会被变化。不能采用。0分。
b) 使用NestedScrollView嵌套到布局里面可以完全显示。95分。推荐指数 ※※※
5分扣在无法做底部margin的控件,只能从上开始算偏移。
1.3 android11+
我们不能总活在兼容中,对于低版本,我们给它个还能接受的方式。
高版本通过自行调整布局translateY或者修改layout某些控件的间距实现。推荐指数 ※※ 代码比较复杂。
if (Build.VERSION.SDK_INT < 30) { //11以下
activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
} else {
activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
ViewCompat.setWindowInsetsAnimationCallback(decorView, mAnimCallback)
}
2. 如果Activity是WebView中键盘弹起:
a) 如果非全屏模式,可以使用adjustResize;
b) 如果是全屏模式(你使用了transparentStatusBar),则使用AndroidBug5497Workaround进行处理。
备注:其他的什么webview.requestFocus(View.FOCUS_DOWN) 均不能生效。