android键盘与布局记录

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) 均不能生效。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值