问题描述

点击edittext,弹出软键盘,dialog略微上移,edittext和下面的按钮还是被遮挡,上移的部分被切割

解决方案

设置dialog的inputMode,取消软键盘弹出自动上移

监听软键盘弹出事件,动态设置dialog的paddingBottom

override fun init() {

dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)

globalListener = KeyboardUtils.registerSoftInputChangedListener(activity, object : KeyboardUtils.OnSoftInputChangedListener {

override fun onSoftInputChanged(height: Int) {

val activityPos = intArrayOf(0, 0)

val dialogPos = intArrayOf(0, 0)

activity.window.decorView.getLocationOnScreen(activityPos)

getLocationOnScreen(dialogPos)

val gap = activity.window.decorView.bottom + activityPos[1] - (bottom + dialogPos[1])

if (height > 10 && gap < height) {

dialog?.window?.decorView?.setPadding(0, 0, 0, height - gap + 50)

} else {

dialog?.window?.decorView?.setPadding(0, 0, 0, 0)

}

}

})

}

override fun onDestroy() {

super.onDestroy()

if (globalListener != null) {

KeyboardUtils.unregisterSoftInputChangedListener(activity, globalListener!!)

}

}

fun registerSoftInputChangedListener(activity: Activity,

listener: OnSoftInputChangedListener?)

: ViewTreeObserver.OnGlobalLayoutListener {

val contentView = activity.findViewById(android.R.id.content)

sContentViewInvisibleHeightPre = getContentViewInvisibleHeight(activity)

val globalListener = ViewTreeObserver.OnGlobalLayoutListener {

if (listener != null) {

val height = getContentViewInvisibleHeight(activity)

if (sContentViewInvisibleHeightPre != height) {

listener.onSoftInputChanged(height)

sContentViewInvisibleHeightPre = height

}

}

}

contentView.viewTreeObserver.addOnGlobalLayoutListener(globalListener)

return globalListener

}

fun unregisterSoftInputChangedListener(activity: Activity,

listener: ViewTreeObserver.OnGlobalLayoutListener) {

val contentView = activity.findViewById(android.R.id.content)

contentView.viewTreeObserver.removeOnGlobalLayoutListener(listener)

}

private fun getContentViewInvisibleHeight(activity: Activity): Int {

val contentView = activity.findViewById(android.R.id.content)

val outRect = Rect()

contentView.getWindowVisibleDisplayFrame(outRect)

return contentView.bottom - outRect.bottom

}

总结

dialog销毁一定要移除global监听,否则回调里面拿到的window是上一次的

android dialog遮挡键盘,彻底解决软键盘遮挡DialogFragment相关推荐

  1. Android 模仿QQ登录界面解决软键盘遮挡问题

    Android 软件盘弹出可能会遮挡住界面上的某些控件.当 windowSoftInputMode 为 adjustPan 时,一般不会挡住 EditText,但是假如 EditText 下面是一个登 ...

  2. android 软键盘遮挡登陆按钮的问题,Android优雅的方式解决软键盘遮挡按钮问题

    前言 比如在进行登录的操作中,用户输入完密码之后,肯定是想直接点击登录按钮的.返回键隐藏软键盘这样的体验肯定很糟糕,程序员,遇到问题解决问题. 实现1 xml android:id="@+i ...

  3. Android爬坑之旅:软键盘挡住输入框问题的终极解决方式

    本文由BarryZhang原创,同一时候首发于diycode.cc.barryzhang.com .github.com/barryhappy.非商业转载请注明作者和原文链接. 前言 开发做得久了.总 ...

  4. Android爬坑之旅:软键盘挡住输入框问题的终极解决方案

    前言 开发做得久了,总免不了会遇到各种坑. 而在Android开发的路上,『软键盘挡住了输入框』这个坑,可谓是一个旷日持久的巨坑--来来来,我们慢慢看. 入门篇 Base 最基本的情况,如图所示:在页 ...

  5. 如何解决软键盘弹出引起的各种不适

    1.如何解决软键盘弹出引起的各种不适 2.android软键盘弹出引起的各种不适终极解决方案 3.android软键盘弹出引起的各种不适终极解决方案 4.android软键盘弹出,会把原来的界面挤上去 ...

  6. android EditText取消焦点且退出软键盘

    android EditText取消焦点且退出软键盘 最近发现,如果在一个activity中直接加入EditText的话,每次打开这个activity的时候,就会自动打开软键盘,并且点哪里都取消不了. ...

  7. 【Android笔记50】Android应用如何获取系统服务(软键盘管理器、闹钟管理器)

    这篇文章,主要介绍Android应用如何获取系统服务(软键盘管理器.闹钟管理器). 目录 一.获取系统服务 1.1.软键盘显示和隐藏 (1)showSoftInput显示软键盘

  8. android隐藏软键盘方法,Android使用InputMethodManager显示和隐藏软键盘

    Android主要用InputMethodManager来对软键盘进行管理.手动显示或隐藏软键盘前需要先获取InputMethodManager. InputMethodManager imm = ( ...

  9. Android中获取软键盘状态和软键盘高度

    应用场景 在Android应用中有时会需要获取软键盘的状态(即软键盘是显示还是隐藏)和软键盘的高度.这里列举了一些可能的应用场景. 场景一 当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一 ...

  10. android点击键盘外关闭软键盘

    安卓功能记录之点击键盘外关闭软键盘,用于日常记录 //关闭软键盘@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.g ...

最新文章

  1. oracleHelper 操作帮助类
  2. vbscript input select 添加个option根据value值到指定位置--相当于排序
  3. DNS服务器搭建笔记
  4. 想在VR中体验暴雪爸爸的游戏,还得再等等
  5. shell 函数返回值接收问题
  6. 不用羡慕BAT,自己手工也能搭建伪基站监控系统
  7. Eclipse 高亮显示选中的相同变量
  8. 外星人入侵 python 飞船位置_《python从入门到实践》项目一:外星人入侵
  9. 【预训练模型】一文串起从NLP到CV 预训练技术和范式演进
  10. 136 - Ugly Numbers
  11. ssl 命令访问其他的服务器
  12. Chrome 去掉“该网站的安全证书不受信任!”的提示
  13. 猜年龄python实现
  14. java实现md5签名算法
  15. 实用 Windows 软件系列分享(七)
  16. 干货秘籍:网易游戏《率土之滨》原画设计师分享创作设计经验
  17. oracle 存储过程带入参,oracle中带参存储过程的使用
  18. 智慧景区:EasyCVR视频+智能分析,助力景区智慧化服务监管
  19. html代码劫持教程,记录一次 JavaScript解密(跳转劫持代码)全过程
  20. Centos安装 Node.js v12.16.1 和 v16.14

热门文章

  1. 2014年牡丹江现场赛打铁记
  2. CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below m
  3. 李飞飞CS231n课程-中文笔记(包括课后作业要求)翻译汇总
  4. html 网页不可以复制粘贴,网页上的文字不能复制,三种方法教你复制全网文字...
  5. android点击复制链接地址,在Android中的EditView中可点击链接和复制/粘贴菜单
  6. c语言中swipe的作用,浅谈在vue中使用mint-ui swipe遇到的问题
  7. 观察containerd-shim-runc-v2进程与容器里的1号进程
  8. Frank-Cucumber - Core Frank Steps
  9. Win10锁屏壁纸图片保存
  10. 四六级成绩批量查询器