1.写在前面

2017年的第一篇博客,首先祝大家新年快乐,在新的一年里健健康康、平平安安!

本篇博客的主要内容是关于在Dialog中软键盘的显示与隐藏问题,需求是在Dialog中有一个密码输入框,弹出Dialog显示软键盘,关闭Dialog隐藏软键盘。
嗯,是不是有点简单,不过在实现的过程中还是遇到了一些问题,在试过了网上大部分的方法之后,最终找到了一个还不错的方法,分享给大家。

看下效果图:

2.实现过程

先说说最开始的实现方法:

// 显示Dialog
dialog.show();// 显示软键盘
SoftInputUtils.showSoftInput(activity);

But,软键盘并没有显示,显示软键盘有两种方法,使用的是第一种方法,第二种方法在Dialog中没有效果。

// 第一种,如果软键盘在窗口上已经显示,则隐藏,反之则显示
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);// 第二种,强制显示软键盘,view为当前的输入框对象
inputMethodManager.showSoftInput(view,InputMethodManager.SHOW_FORCED);  

于是查看Dialog的源码,发现Dialog的显示和隐藏是通过Handler来处理的,会不会是显示软键盘的方法执行的太快了,于是在show方法后延时显示软键盘,发现是可以正常显示的。
但是延时处理这种方法显然不太好,有没有一种Dialog显示完成后就能回调的方法呢,嗯,有的,setOnShowListener方法,在OnShowListener接口的回调方法onShow中显示软键盘就可以了。软键盘的隐藏并没有这些限制,在dismiss之后隐藏,或者在回调方法onDismiss中隐藏都可以。

/*** 发送显示Dialog的消息*/
private void sendShowMessage() {if (mShowMessage != null) {// Obtain a new message so this dialog can be re-usedMessage.obtain(mShowMessage).sendToTarget();}
}/*** 接收显示或隐藏Dialog的消息*/
private static final class ListenersHandler extends Handler {private WeakReference<DialogInterface> mDialog;public ListenersHandler(Dialog dialog) {mDialog = new WeakReference<DialogInterface>(dialog);}@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case DISMISS:((OnDismissListener) msg.obj).onDismiss(mDialog.get());break;case CANCEL:((OnCancelListener) msg.obj).onCancel(mDialog.get());break;case SHOW:((OnShowListener) msg.obj).onShow(mDialog.get());break;}}
}

延时显示软键盘

new Thread() {@Overridepublic void run() {super.run();activity.runOnUiThread(new Runnable() {@Overridepublic void run() {SoftInputUtils.showSoftInput(activity);}});}
}.start();

3.代码

显示Dialog提示框

public class DialogUtils {private static Dialog dialog;/*** Dialog提示框消失方法*/public static void dialogDismiss() {if (isDialogShowing()) {dialog.dismiss();dialog = null;}}/*** Dialog提示框是否正在运行** @return Dialog提示框是否正在运行*/public static boolean isDialogShowing() {return dialog != null && dialog.isShowing();}/*** 创建Dialog提示框** @param context 上下文*/private static void createDialog(Context context) {dialogDismiss();dialog = new Dialog(context, R.style.SampleTheme);dialog.setContentView(R.layout.layout_dialog);// 点击弹窗外区域,弹窗不消失dialog.setCanceledOnTouchOutside(false);}/*** 显示确认安全码提示框** @param activity              当前Activity* @param dialogOnClickListener 确定按钮点击事件*/public static void showSecurityCodeInputDialog(final Activity activity,final DialogOnClickListener dialogOnClickListener) {createDialog(activity);ImageView ivClose = (ImageView) dialog.findViewById(R.id.iv_close);final GridPasswordView gpvCode = (GridPasswordView) dialog.findViewById(R.id.gpv_code);Button btnOk = (Button) dialog.findViewById(R.id.btn_ok);ivClose.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialogDismiss();}});btnOk.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String code = gpvCode.getPassWord();dialogOnClickListener.onClick(code);}});dialog.setOnShowListener(new DialogInterface.OnShowListener() {@Overridepublic void onShow(DialogInterface dialog) {// 获取焦点gpvCode.requestFocus();// 显示软键盘SoftInputUtils.showSoftInput(activity);}});dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {// 隐藏软键盘SoftInputUtils.hideSoftInput(activity);}});dialog.show();}public interface DialogOnClickListener {/*** 点击事件** @param str 回调参数*/public void onClick(String str);}
}

显示和隐藏软键盘的方法

public class SoftInputUtils {/*** 显示软键盘,Dialog使用** @param activity 当前Activity*/public static void showSoftInput(Activity activity) {InputMethodManager inputMethodManager =(InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);}/*** 隐藏软键盘** @param activity 当前Activity*/public static void hideSoftInput(Activity activity) {InputMethodManager inputMethodManager =(InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);inputMethodManager.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);}
}

调用显示Dialog的方法

DialogUtils.showSecurityCodeInputDialog(this, new DialogUtils.DialogOnClickListener() {@Overridepublic void onClick(String str) {Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();DialogUtils.dialogDismiss();}
});

4.写在最后

在频繁的显示、关闭Dialog的测试中发现,有时软键盘不会显示,但是没有找到规律,有了解的同学可以给我留言评论。

欢迎同学们吐槽评论,如果你觉得本篇博客对你有用,那么就留个言或者顶一下吧(^-^)

完整的Demo下载

Android Dialog与软键盘的正确打开方式相关推荐

  1. 【转】android软键盘显示与主窗口调整方式设置,Android软键盘显示模式及打开和关闭方式(推荐)...

    Android软键盘显示模式: Android定义了一个属性,名字为windowSoftInputMode,用它可以让程序可以控制活动主窗口调整的方式.我们可以在AndroidManifet.xml中 ...

  2. android 键盘将底部视图顶起,android 弹出软键盘将底部视图顶起问题

    今天要做一个搜索功能,搜索界面采用AutoCompleteTextView做搜索条,然后下面用listview来显示搜索结果,而我的主界面是在底 部用tab做了一个主界面导航,其中有一个搜索按钮,因为 ...

  3. Android 文本,软键盘使用指南

    目录 TextView的基本使用 TextView的基本属性 图文混排的三种实现方式 drawableTop,DrawableBottom,DrawableLeft,drawableRight 通过I ...

  4. Android 监听软键盘的高度并解决其覆盖输入框的问题

    1.前言 在某些项目中,我们常常需要自定义一个输入框,软键盘弹出时就把输入框顶上去,关闭时输入框再回到原位(比如下方的效果图,实际上各种 App 中的聊天界面和发布评论的界面大体都是这样).在这个过程 ...

  5. android 输入法 确定按钮,Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究...

    在项目开发中,用到编辑框的地方经常涉及到要监听或者控制软键盘的显示/隐藏状态.本以为这是很容易解决的一个小问题,没想到当初碰到这个问题才明白还得花点小心思才能整好.现将针对软键盘的显示/隐藏状态的监听 ...

  6. Android PopupWindow 隐藏软键盘的方法

    今天,简单讲讲android里  PopupWindow 弹出在底部,被软键盘遮挡的问题. 之前,自己写一个PopupWindow 弹出在底部,可是如果软键盘显示时弹出,软键盘会遮挡PopupWi ...

  7. Android 自定义安全软键盘 SafeKeyboard 开发详细说明 2.0

    Android 自定义安全软键盘 SafeKeyboard 开发详细说明 2.0 源码地址:GitHub:    https://github.com/SValence/SafeKeyboard 注意 ...

  8. Android EditText将软键盘的回车改为搜索,并监听

    需求为: 当用户在界面内点击输入框,弹出键盘,键盘右下角示意为"搜索"按钮 当用户输入内容后,点击搜索按钮将进行关键词搜索 当用户没有输入内容点击搜索按钮,将收起键盘,回到界面(这 ...

  9. android动态设置错误页面,Android缺省页的正确打开方式(优雅的处理loading、error、empty...

    Android缺省页的正确打开方式(优雅的处理loading.error.empty Android缺省页的正确打开方式(优雅的处理loading.error.empty各种状态缺省) MultiSt ...

最新文章

  1. 顺序表-顺序表表示集合-并集(A复制到C,B遍历比较C)
  2. spark变量使用broadcast、accumulator
  3. 【PAT甲级 - 1028】List Sorting (25分)(模拟,排序)
  4. php中月份以星期为单位,PHP的月份第二个星期六
  5. python中如何移动图形工作站_如何在Python中使用Kriging插入工作站数据?
  6. Clojure Web 开发 (一)
  7. synchronized偏向锁
  8. fspecial 创建预定义的二维滤波器 (Matlab)
  9. 3904三极管是什么功能_你了解三极管的种类吗
  10. win10添加网络打印机_Win7系统添加网络共享打印机
  11. 英文邮件中常见的英语缩写
  12. LeCo-221. 最大正方形
  13. 解决VScode调试C++文件名不能出现中文的情况
  14. 苹果屏幕录制没有声音_有没有简单实用的屏幕录制软件推荐?
  15. 计算机视觉相关学习项目(上)——附MATLAB源代码
  16. 产品经理入门02:项目规划及产品设计
  17. 非网管工业交换机和网管工业交换机区别
  18. 2017年8月历史文章汇总
  19. OJ每日一练——点和正方形的关系
  20. SpringBoot——使用外置的Tomcat服务器

热门文章

  1. 【中间件技术】第二部分 CORBA规范与中间件(4) 编写对象接口
  2. 电子设计教程24:反相比例运算电路
  3. 使用多种姿势上传图片
  4. 2014.10.10 ——Jim Foley第二场讲座User Interface Design——An Overview
  5. 简洁、快速的JavaScript框架/库:jQuery
  6. 数据保护:UPS不间断电源初步使用
  7. 抖音广告营销被处罚限流,减少作品推荐该怎么办丨国仁网络资讯
  8. 通过配置文件修改PenMount中操作模式为Touch
  9. Proteus仿真电路笔记
  10. 虚机安装Linux网络配置的一些笔记(隔离,桥接,NAT)