欢迎来到代码驿站!

Android代码

当前位置:首页 > 移动开发 > Android代码

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

时间:2021-03-02 11:44:45|栏目:Android代码|点击:

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);
  }

上一篇:Android 媒体库数据更新方法总结

栏    目:Android代码

下一篇:Android 7.0 SEAndroid app权限配置方法

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

本文地址:http://www.codeinn.net/misctech/72556.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有