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

dialog dismiss时键盘不消失的问题浅析及解决办法

程序员文章站 2024-02-23 10:59:40
当setcanceledontouchoutside(true),点击阴影处,dialog dismiss时键盘不消失的问题。 如图 一开始觉得很简单,监听下ond...

setcanceledontouchoutside(true),点击阴影处,dialog dismiss时键盘不消失的问题。

如图

dialog dismiss时键盘不消失的问题浅析及解决办法

一开始觉得很简单,监听下ondimiss()方法,在里面隐藏键盘不就行了。

但是发现大多数手机都不会隐藏(魅族x4会隐藏)。

这是为什么呢?为什么键盘不消失呢?

经过测试,发现edittext.getwindowtoken()为null。

 /**
   * 关闭键盘
   *
   * @param context
   * @param et
   */
  public static void hidekeyboard(context context, edittext et) {
    inputmethodmanager imm = (inputmethodmanager) context
        .getsystemservice(context.input_method_service);
    logutils.showlog("hidekeyboard  imm.isactive() = "+imm.isactive()+"    et.getwindowtoken() = "+et.getwindowtoken());
    if (imm.isactive()) {
      imm.hidesoftinputfromwindow(et.getwindowtoken(), 0);
    }
  }

dialog dismiss时键盘不消失的问题浅析及解决办法

这是因为当ondismiss 方法执行的时候,dialog已经消失了。已经获取不到windowtoken了。

目前发现有两种方式觉得这样的问题

1.在ondismiss()方法里面这样隐藏软键盘

 @override
  public void ondismiss(dialoginterface dialog) {
    inputmethodmanager inputmgr = (inputmethodmanager) context
        .getsystemservice(context.input_method_service);
    inputmgr.togglesoftinput(inputmethodmanager.hide_not_always, 0);
  }

2.在dismiss之前就隐藏软键盘,因为设置setcancelontouchoutside(true),会响应dialog类的ontouch方法。

public boolean ontouchevent(motionevent event) {
    if (mcancelable && mshowing && mwindow.shouldcloseontouch(mcontext, event)) {
      cancel();
      return true;
    }
    return false;
  }
/**
   * cancel the dialog. this is essentially the same as calling {@link #dismiss()}, but it will
   * also call your {@link dialoginterface.oncancellistener} (if registered).
   */
  public void cancel() {
    if (!mcanceled && mcancelmessage != null) {
      mcanceled = true;
      // obtain a new message so this dialog can be re-used
      message.obtain(mcancelmessage).sendtotarget();
    }
    dismiss();
  }

重写下ontouch()方法就可以了。代码如下

 @override
  public boolean ontouchevent(motionevent event) {
    if (isshowing() && shouldcloseontouch(getcontext(),event)){
      viewhelper.hidekeyboard(context, et_reply_comment);
    }
    return super.ontouchevent(event);
  }
  public boolean shouldcloseontouch(context context, motionevent event) {
    if (event.getaction() == motionevent.action_down
        && isoutofbounds(context, event) && getwindow().peekdecorview() != null) {
      return true;
    }
    return false;
  }
  private boolean isoutofbounds(context context, motionevent event) {
    final int x = (int) event.getx();
    final int y = (int) event.gety();
    final int slop = viewconfiguration.get(context).getscaledwindowtouchslop();
    final view decorview = getwindow().getdecorview();
    return (x < -slop) || (y < -slop)
        || (x > (decorview.getwidth()+slop))
        || (y > (decorview.getheight()+slop));
  }
   // 关闭键盘
  public static void hidekeyboard(context context, edittext et) {
    inputmethodmanager imm = (inputmethodmanager) context
        .getsystemservice(context.input_method_service);
    logutils.showlog("hidekeyboard  imm.isactive() = "+imm.isactive()+"    et.getwindowtoken() = "+et.getwindowtoken());
    if (imm.isactive()) {
      imm.hidesoftinputfromwindow(et.getwindowtoken(), 0);
    }
  }

经测试,以上两种方法都可以关闭软键盘。

另外附在dialog启动时弹出软键盘代码,重写onstart方法

@override
  protected void onstart() {
    super.onstart();
    getwindow().setsoftinputmode(windowmanager.layoutparams.soft_input_state_always_visible);
  }

以上所述是小编给大家介绍的dialog dismiss时键盘不消失的问题浅析,希望对大家有所帮助