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

 更新时间:2017年01月09日 17:14:05   作者:猪猪上  
这篇文章主要介绍了dialog dismiss时键盘不消失的问题浅析及两种解决方法,非常不错,具有参考借鉴价值,需要的朋友参考下

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时键盘不消失的问题浅析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

相关文章

  • 详解androidstudio项目上传到github方法以及步骤

    详解androidstudio项目上传到github方法以及步骤

    在使用studio开发的项目过程中有时候我们想将项目发布到github上,studio其实是自带这种功能的,那么如何使用呢,下面我们就一起来了解一下
    2019-01-01
  • Android数据双向绑定原理实现和应用场景

    Android数据双向绑定原理实现和应用场景

    本文介绍了Android数据双向绑定的原理和实现方式,包括基于观察者模式和数据绑定框架的实现方法,以及应用场景和优缺点的分析,帮助开发者了解和应用数据双向绑定技术,提升应用的交互性和响应速度
    2023-04-04
  • 详解Android首选项框架的使用实例

    详解Android首选项框架的使用实例

    首选项这个名词对于熟悉Android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数。本篇文章主要介绍详解Android首选项框架的使用实例,有兴趣的可以了解一下。
    2016-11-11
  • Android自定义照相机的实例

    Android自定义照相机的实例

    这篇文章主要介绍了Android自定义照相机的实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • Kotlin创建一个好用的协程作用域

    Kotlin创建一个好用的协程作用域

    这篇文章主要介绍了Kotlin创建一个好用的协程作用域,kotlin中使用协程,是一定要跟协程作用域一起配合使用的,否则可能协程的生命周期无法被准确控制,造成内存泄漏或其他问题
    2022-07-07
  • Flutter与WebView通信方案示例详解

    Flutter与WebView通信方案示例详解

    这篇文章主要为大家介绍了Flutter与WebView通信方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    这篇文章是基于Android Studio 3.01版本的,NDK是R16。本文重点给大家介绍Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库的相关知识,感兴趣的朋友一起看看吧
    2018-01-01
  • Android开发设置RadioButton点击效果的方法

    Android开发设置RadioButton点击效果的方法

    这篇文章主要介绍了Android开发设置RadioButton点击效果的方法,详细分析了Android开发中RadioButton属性功能及相关设置技巧,需要的朋友可以参考下
    2017-06-06
  • Android使用ViewPager实现滚动广告

    Android使用ViewPager实现滚动广告

    这篇文章主要为大家详细介绍了Android使用ViewPager实现滚动广告,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 揭秘Android视图绘制的流程步骤

    揭秘Android视图绘制的流程步骤

    在Android的UI中,View是至关重要的一个组件,它是用户界面的基本构建块,在View的绘制过程中,涉及到很多重要的概念和技术,本文将详细介绍Android View的绘制过程,让你能够更好地理解和掌握Android的UI开发,需要的朋友可以参考下
    2023-06-06

最新评论