android自动退出对话框,Android开发 在用EditText对话框Dialog退出后实现输入盘的退出...
前言
在使用继承的Dialog的方式实现自定义Dialog,如果这个Dialog我们还添加了EditText就会发现一个问题。在输入盘显示后,Dialog退出输入盘不会退出。网上有一些奇怪的解决办法,最奇怪的是去根据Touch事件判断Touch坐标来确定是否点击了空白在隐藏输入盘,绕了一个大圈来实现,根本就没仔细阅读过Dialog的代码。其实实现退出Dialog的时候隐藏输入法很简单,只要重写Dialog的dismiss()方法即可,为什么写这篇博客是因为不想大家被错误的实现方式而误导。所以,这里会啰嗦下问题根结。
了解Dialog的退出方式
在了解隐藏输入盘之前,需要排列一下Dialog的退出的3种方式:
1.自定义退出按键,点击后实现dialog.dismiss(); 退出对话框
2.按back键,退出对话框
3.点击Dialog外面的空白背景,退出对话框
错误的隐藏输入盘的方式
@Overridepublic voidonClickLeft(EditDialog dialog) {
dialog.dismiss();
InputMethodManager imm=(InputMethodManager) dialog.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(dialog.getEditContent().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
说说为什么这种方式有问题,其实是因为你调用了dialog.dismiss(); 后在获取dialog.getEditContent().getWindowToken() 这个token的时候,必定会返回为null。 因为你的Dialog已经退出了。这个EditText已经被Window解除关系。所以我们需要在dimiss方法之前隐藏输入盘。
容易被误导难点在哪里?
看了上面的错误例子,我们肯定会在隐藏输入法后在调用dismiss(); 好像问题已经解决了? 并没有,因为你只解决了第一种情况 ”自定义退出按键,点击后实现dialog.dismiss(); 退出对话框“ ,还有
”按back键,退出对话框“
”点击Dialog外面的空白背景,退出对话框“
这2个情况的调用是Dialog直接在内部封装调用了dismiss(); 你无法在获取在dismiss之前操作隐藏输入盘。 setOnDismissListener();方法 与 setOnCancelListener();方法 都是执行完dismiss();方法后调用的。这里下面的源码中看到
按外部空白退出的方式
/*** Called when a touch screen event was not handled by any of the views
* under it. This is most useful to process touch events that happen outside
* of your window bounds, where there is no view to receive it.
*
*@paramevent The touch screen event being processed.
*@returnReturn true if you have consumed the event, false if you haven‘t.
* The default implementation will cancel the dialog when a touch
* happens outside of the window bounds.*/
public booleanonTouchEvent(@NonNull MotionEvent event) {if (mCancelable && mShowing &&mWindow.shouldCloseOnTouch(mContext, event)) {
cancel();return true;
}return false;
}
按返回键退出的方式
/*** Called when the dialog has detected the user‘s press of the back
* key. The default implementation simply cancels the dialog (only if
* it is cancelable), but you can override this to do whatever you want.*/
public voidonBackPressed() {if(mCancelable) {
cancel();
}
}
最后都调用了cancel()方法,而cancel方法最后都调用了dismiss方法,但是这些回调都是用Handler发出去的,所以Dialog都已经关闭(并没有被销毁)与window解除了绑定关系了,才会接收到setOnDismissListener();方法 与 setOnCancelListener(); 这2个回调。所以在这2个回调里写隐藏输入盘也是错误的。
正确的方式
重写dismiss方法
@Overridepublic voiddismiss() {
InputMethodManager imm=(InputMethodManager) mEditContent.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditContent.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);super.dismiss();
}
End
原文:https://www.cnblogs.com/guanxinjing/p/12980640.html
android自动退出对话框,Android开发 在用EditText对话框Dialog退出后实现输入盘的退出...相关推荐
- android自动创建快捷方式,Android开发之生成桌面快捷方式细则(原创)
本文已独家授权 郭霖 ( guolin_blog) 公众号发布! 申明,标题里的快捷方式不是指开发人员使用频率极高的Ctrl+C和Ctrl+V:也不是IDE里Ctrl+D.Ctrl+F等常用快捷键.这 ...
- android 自动 键盘,关于Android中的软键盘
InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系 ...
- android自动更新demo,Android程序自动更新功能模块的实现方法【附完整demo源码下载】...
本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更 ...
- android 自动静音模式,Android实现定时自动静音小助手
定时静音助手的实现方法,供大家参考,具体内容如下 背景 突发奇想,刚好这学期刚上安卓课程,想设计一个时间助手.工作.学习中经常会被突如其来的电话所打扰,在上班,上课时这突如其来的铃声会惹来别人的反感, ...
- android自动夜间模式,Android实现日夜间模式的深入理解
在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...
- android自动切换图片,Android应用中图片浏览时实现自动切换功能的方法详解
先给最终效果图: 当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能! activity代码: package cn.com. ...
- Android 自动搜索频道,Android自定义收音机搜台控件RadioRulerView
前言:像这类的自定义控件有非常多的开源项目,但还是没有找到我项目想要的,所以简单实现了一个,下面简单讲讲实现原理. 效果图: 实现思路: 首先画固定背景尺子,而实现这个则要计算刻度线的宽度.刻度线间的 ...
- android 自动挂断,android实现接通和挂断电话
本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...
- android自动获取位置,Android中获取当前位置信息
这篇教程主要介绍了在Android平台上如何使用服务完成定位功能.众所周知,Android设备的当前位置信息,对开发创新性App.解决人们日常生活问题有极大帮助.在Android平台开发定位相关的应用 ...
最新文章
- oracle参数文件initorcl位置,ORACLE参数文件
- R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战
- HTML5做手机站页面字体显示很小的解决方法
- 微信“小程序”开发小指南
- 编写二分查找和使用集合类的二分查找实现
- resize view from nib引起的子控制器视图(childviewcontroller)部分区域无响应
- HTML常用标签(三)
- Altium Designer15安装破解教程
- HTML 标签中的连续的英文折断
- 测测你的IQ加分析能力
- 使用3D Max里面自带的门,怎么设置动画并预览
- 2022无线蓝牙耳机选哪个?盘点超热门的蓝牙耳机品牌推荐
- 图片,文字在线转为字符画
- 对于信息传播的一点理解
- 如何成为Android高手
- 百度地图实现普通地图、卫星图、三维图、混合图(卫星图+路网)
- 计算机理论知识论文,理论知识:计算机科学与技术硕士毕业论文写作方法
- Zemax优化过程中的Rings和Arms
- oracle建表备份数据,oracle建表备份脚本,如果update的数据不对,可以从WEB_RI_PLYEDR_CED_BAK找回...
- 解决Microsoft Store无法下载软件问题
热门文章
- 使用CDI的InjectionPoint注入配置值
- Spring– DAO和服务层
- IO与NIO –中断,超时和缓冲区
- jsp循环输出表格_「翻译」JS可视化学习之七:Promise、事件循环和异步2
- Linux 命令之 groupdel -- 删除指定的用户组
- Linux 命令之 head -- 在屏幕上显示指定文件的开头若干行/显示文件开头内容/查看文件开头内容
- 交华为换机access配置_华为交换机VLAN内Proxy ARP配置示例
- lisp文字上标源码_创建文本/标注样式源码 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
- lnp和mysql分开安装_毕业设计之LNP+DISCUZ +分离的数据库操作
- C语言 | 语句概述