dialog dismiss时键盘不消失的问题浅析及解决办法
作者:猪猪上 发布时间:2021-09-18 10:06:30
标签:dialog,dismiss,键盘,不消失
当setCanceledOnTouchOutside(true)
,点击阴影处,dialog dismiss时键盘不消失的问题。
如图
一开始觉得很简单,监听下onDimiss()
方法,在里面隐藏键盘不就行了。
但是发现大多数手机都不会隐藏(魅族x4会隐藏)。
这是为什么呢?为什么键盘不消失呢?
经过测试,发现edittext.getWindowToken()
为null。
/**
* 关闭键盘
*
* @param context
* @param et
*/
public static void hideKeyboard(Context context, EditText et) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
LogUtils.showLog("hideKeyboard imm.isActive() = "+imm.isActive()+" et.getWindowToken() = "+et.getWindowToken());
if (imm.isActive()) {
imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
}
}
这是因为当ondismiss 方法执行的时候,dialog已经消失了。已经获取不到windowToken了。
目前发现有两种方式觉得这样的问题
1.在ondismiss()方法里面这样隐藏软键盘
@Override
public void onDismiss(DialogInterface dialog) {
InputMethodManager inputMgr = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMgr.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
}
2.在dismiss之前就隐藏软键盘,因为设置setCancelOnTouchOutside(true),会响应Dialog类的onTouch方法。
public boolean onTouchEvent(MotionEvent event) {
if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event)) {
cancel();
return true;
}
return false;
}
/**
* Cancel the dialog. This is essentially the same as calling {@link #dismiss()}, but it will
* also call your {@link DialogInterface.OnCancelListener} (if registered).
*/
public void cancel() {
if (!mCanceled && mCancelMessage != null) {
mCanceled = true;
// Obtain a new message so this dialog can be re-used
Message.obtain(mCancelMessage).sendToTarget();
}
dismiss();
}
重写下onTouch()方法就可以了。代码如下
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isShowing() && shouldCloseOnTouch(getContext(),event)){
ViewHelper.hideKeyboard(context, et_reply_comment);
}
return super.onTouchEvent(event);
}
public boolean shouldCloseOnTouch(Context context, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN
&& isOutOfBounds(context, event) && getWindow().peekDecorView() != null) {
return true;
}
return false;
}
private boolean isOutOfBounds(Context context, MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop)
|| (x > (decorView.getWidth()+slop))
|| (y > (decorView.getHeight()+slop));
}
// 关闭键盘
public static void hideKeyboard(Context context, EditText et) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
LogUtils.showLog("hideKeyboard imm.isActive() = "+imm.isActive()+" et.getWindowToken() = "+et.getWindowToken());
if (imm.isActive()) {
imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
}
}
经测试,以上两种方法都可以关闭软键盘。
另外附在dialog启动时弹出软键盘代码,重写onStart方法
@Override
protected void onStart() {
super.onStart();
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
以上所述是小编给大家介绍的dialog dismiss时键盘不消失的问题浅析网站的支持!
来源:http://blog.csdn.net/a77979744/article/details/54289909


猜你喜欢
- 本文实例为大家分享了C#生成唯一订单号的具体代码,供大家参考,具体内容如下根据GUID+DateTime.Now.Ticks生产唯一订单号/
- 最近没做项目,重新整理了一个最完整的Mybatis Generator(简称MBG)的最完整配置文件,带详解,再也不用去看EN的User G
- 这篇文章主要介绍了SpringBoot登录判断代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 为什么要用Jupyter Notebook推荐新手写python用什么编辑器就有有人问:为什么没有Jupyter Notebook。本来想数
- 前言Java 语言很强大,但是,有人的地方就有江湖,有猿的地方就有 bug,Java 的核心代码并非十全十美。比如在 JDK 中居然也有反模
- 引言近期,Google 发布了 Android 11的平台稳定版本。Android 11 将在确保用户隐私安全的前提下,更好地让用户畅享最新
- 准备过程:在电脑桌面 右键点击 “此电脑”的“属性”选项选择“高级系统设置”选项点击下面的“环境变量”选项配置过程:点击“系统变量”下面的”
- 本文将是JVM 性能优化系列的第二篇文章(第一篇:传送门),Java 编译器将是本文讨论的核心内容。本文中,作者(Eva Andreasso
- 前言自从 2017 年 C# 7.0 版本开始引入声明模式和常数模式匹配开始,到 2022 年的 C# 11 为止,最后一个板块列表模式和切
- 一、默认静态资源路径类路径下:staticpublicresources这几个目录为默认静态资源访问的目录二、增加静态资源路径前缀动态资源和
- AOP拦截Controller获取@PathVariable注解传入参数前言:最近项目中需要对controller传入的应用标识(appMa
- C#中Invoke的用法()invoke和begininvoke 区别一直对invoke和begininvoke的使用和概念比较混乱,这两天
- 目录1.加载本地Word2.以只读模式加载Word3.从流加载Word【程序环境】Windows 10Visual Studio 2017W
- java 8引入了lambda表达式,lambda表达式实际上表示的就是一个匿名的function。在java 8之前,如果需要使用到匿名f
- 效果视频目录结构SVG常用指令L :为从当前点绘制到直线给定的点,后面跟着的为x,y坐标M :为将画笔移动到某一点,但只是移动画笔,并没有绘
- Spring Boot 解决富文本上传图片跨域在前后端分离的情况下,后台所写的接口在前端调用的时候,可能前端浏览器已经读取到了数据,但是在前
- 注意:页面分别拖拽一个FileUpload、Button1、Label1、GridView控件,并新建一个UploadedExcel文件夹D
- 本文实例为大家分享了Android广播实现App开机自启动的具体代码,供大家参考,具体内容如下一、概括在安卓中,想要实现app开机自动启动,
- 前言之前有做个一个自定义报表的查询,这里使用的是一个动态的sql拼接,是前端选择了什么指标就查询什么信息!(这里的指标是多个表的字段,前端随
- 本文主要介绍了Spring Security OAuth2 实现登录互踢的示例代码,分享给大家,具体如下:背景说明一个账号只能一处登录,类似