当前位置: 移动技术网 > IT编程>移动开发>Android > Android Dialog中软键盘的显示与隐藏的示例

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

iphone6香港预定,pama电视剧,抄股

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的测试中发现,有时软键盘不会显示,但是没有找到规律,有了解的同学可以给我留言评论。

 

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网