当前位置: 移动技术网 > 移动技术>移动开发>Android > dialog dismiss时键盘不消失的问题浅析及解决办法

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

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

setcanceledontouchoutside(true),点击阴影处,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);
    }
  }

这里写图片描述

这是因为当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时键盘不消失的问题浅析,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网