Android Dialog中软键盘的显示与隐藏的示例
发布时间 - 2026-01-10 22:54:44 点击率:次1.写在前面

本篇的主要内容是关于在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-used
Message.obtain(mShowMessage).sendToTarget();
}
}
/**
* 接收显示或隐藏Dialog的消息
*/
private static final class ListenersHandler extends Handler {
private WeakReference<DialogInterface> mDialog;
public ListenersHandler(Dialog dialog) {
mDialog = new WeakReference<DialogInterface>(dialog);
}
@Override
public 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() {
@Override
public void run() {
super.run();
activity.runOnUiThread(new Runnable() {
@Override
public 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() {
@Override
public void onClick(View v) {
dialogDismiss();
}
});
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String code = gpvCode.getPassWord();
dialogOnClickListener.onClick(code);
}
});
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
// 获取焦点
gpvCode.requestFocus();
// 显示软键盘
SoftInputUtils.showSoftInput(activity);
}
});
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public 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() {
@Override
public void onClick(String str) {
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
DialogUtils.dialogDismiss();
}
});
4.写在最后
在频繁的显示、关闭Dialog的测试中发现,有时软键盘不会显示,但是没有找到规律,有了解的同学可以给我留言评论。
完整的Demo下载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# dialog软键盘
# android隐藏软键盘
# dialog自动弹出软键盘
# Android软键盘的显示隐藏功能实现过程
# Android 显示和隐藏软键盘的方法(手动)
# Android编程之软键盘的隐藏显示实例详解
# 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
# Android开发中软键盘的显示和隐藏
# 回调
# 是在
# 种方法
# 输入框
# 的是
# 正在运行
# 就能
# 中有
# 会不会
# 给大家
# 弹出
# 还不错
# 主要内容
# 有两种
# 没有找到
# 写在
# 第二种
# 第一种
# 给我留言
# 大家多多
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
敲碗10年!Mac系列传将迎来「触控与联网」双革新
新三国志曹操传主线渭水交兵攻略
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel如何实现用户密码重置功能?(完整流程代码)
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Laravel怎么连接多个数据库_Laravel多数据库连接配置
WEB开发之注册页面验证码倒计时代码的实现
Laravel用户密码怎么加密_Laravel Hash门面使用教程
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
如何用西部建站助手快速创建专业网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何用wdcp快速搭建高效网站?
微信小程序 配置文件详细介绍
实例解析angularjs的filter过滤器
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
Laravel如何处理文件下载请求?(Response示例)
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
Laravel定时任务怎么设置_Laravel Crontab调度器配置
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
网站制作免费,什么网站能看正片电影?
Laravel如何使用Eloquent进行子查询
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
如何续费美橙建站之星域名及服务?
JavaScript如何实现音频处理_Web Audio API如何工作?
JavaScript模板引擎Template.js使用详解
javascript中的try catch异常捕获机制用法分析
Laravel怎么在Blade中安全地输出原始HTML内容
韩国服务器如何优化跨境访问实现高效连接?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
手机软键盘弹出时影响布局的解决方法
Python文件流缓冲机制_IO性能解析【教程】
黑客入侵网站服务器的常见手法有哪些?
详解vue.js组件化开发实践
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
无锡营销型网站制作公司,无锡网选车牌流程?
米侠浏览器网页背景异常怎么办 米侠显示修复
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
详解Huffman编码算法之Java实现
如何在云虚拟主机上快速搭建个人网站?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
PHP 500报错的快速解决方法

