前言

在使用继承的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退出后实现输入盘的退出...相关推荐

  1. android自动创建快捷方式,Android开发之生成桌面快捷方式细则(原创)

    本文已独家授权 郭霖 ( guolin_blog) 公众号发布! 申明,标题里的快捷方式不是指开发人员使用频率极高的Ctrl+C和Ctrl+V:也不是IDE里Ctrl+D.Ctrl+F等常用快捷键.这 ...

  2. android 自动 键盘,关于Android中的软键盘

    InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系 ...

  3. android自动更新demo,Android程序自动更新功能模块的实现方法【附完整demo源码下载】...

    本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更 ...

  4. android 自动静音模式,Android实现定时自动静音小助手

    定时静音助手的实现方法,供大家参考,具体内容如下 背景 突发奇想,刚好这学期刚上安卓课程,想设计一个时间助手.工作.学习中经常会被突如其来的电话所打扰,在上班,上课时这突如其来的铃声会惹来别人的反感, ...

  5. android自动夜间模式,Android实现日夜间模式的深入理解

    在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...

  6. android自动切换图片,Android应用中图片浏览时实现自动切换功能的方法详解

    先给最终效果图: 当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能! activity代码: package cn.com. ...

  7. Android 自动搜索频道,Android自定义收音机搜台控件RadioRulerView

    前言:像这类的自定义控件有非常多的开源项目,但还是没有找到我项目想要的,所以简单实现了一个,下面简单讲讲实现原理. 效果图: 实现思路: 首先画固定背景尺子,而实现这个则要计算刻度线的宽度.刻度线间的 ...

  8. android 自动挂断,android实现接通和挂断电话

    本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...

  9. android自动获取位置,Android中获取当前位置信息

    这篇教程主要介绍了在Android平台上如何使用服务完成定位功能.众所周知,Android设备的当前位置信息,对开发创新性App.解决人们日常生活问题有极大帮助.在Android平台开发定位相关的应用 ...

最新文章

  1. oracle参数文件initorcl位置,ORACLE参数文件
  2. R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战
  3. HTML5做手机站页面字体显示很小的解决方法
  4. 微信“小程序”开发小指南
  5. 编写二分查找和使用集合类的二分查找实现
  6. resize view from nib引起的子控制器视图(childviewcontroller)部分区域无响应
  7. HTML常用标签(三)
  8. Altium Designer15安装破解教程
  9. HTML 标签中的连续的英文折断
  10. 测测你的IQ加分析能力
  11. 使用3D Max里面自带的门,怎么设置动画并预览
  12. 2022无线蓝牙耳机选哪个?盘点超热门的蓝牙耳机品牌推荐
  13. 图片,文字在线转为字符画
  14. 对于信息传播的一点理解
  15. 如何成为Android高手
  16. 百度地图实现普通地图、卫星图、三维图、混合图(卫星图+路网)
  17. 计算机理论知识论文,理论知识:计算机科学与技术硕士毕业论文写作方法
  18. Zemax优化过程中的Rings和Arms
  19. oracle建表备份数据,oracle建表备份脚本,如果update的数据不对,可以从WEB_RI_PLYEDR_CED_BAK找回...
  20. 解决Microsoft Store无法下载软件问题

热门文章

  1. 使用CDI的InjectionPoint注入配置值
  2. Spring– DAO和服务层
  3. IO与NIO –中断,超时和缓冲区
  4. jsp循环输出表格_「翻译」JS可视化学习之七:Promise、事件循环和异步2
  5. Linux 命令之 groupdel -- 删除指定的用户组
  6. Linux 命令之 head -- 在屏幕上显示指定文件的开头若干行/显示文件开头内容/查看文件开头内容
  7. 交华为换机access配置_华为交换机VLAN内Proxy ARP配置示例
  8. lisp文字上标源码_创建文本/标注样式源码 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  9. lnp和mysql分开安装_毕业设计之LNP+DISCUZ +分离的数据库操作
  10. C语言 | 语句概述