欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Dialog中软键盘的显示与隐藏的示例

程序员文章站 2023-12-19 13:53:22
1.写在前面 本篇的主要内容是关于在dialog中软键盘的显示与隐藏问题,需求是在dialog中有一个密码输入框,弹出dialog显示软键盘,关闭dialog隐藏软键盘。...

1.写在前面

本篇的主要内容是关于在dialog中软键盘的显示与隐藏问题,需求是在dialog中有一个密码输入框,弹出dialog显示软键盘,关闭dialog隐藏软键盘。

嗯,是不是有点简单,不过在实现的过程中还是遇到了一些问题,在试过了网上大部分的方法之后,最终找到了一个还不错的方法,分享给大家。

看下效果图:

Android 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下载 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: