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报错的快速解决方法