一、在项目开发过程中,界面包含EditText输入框时,输入内容时软键盘弹起。但是此时我们调用界面中自定义的返回按钮执行.finish()方法销毁Activity后发现软键盘并没有跟随关闭收回,参考了网上相关的方法:

注意:此篇记录的是调用.finish()返回时软键盘未回收问题,而非手机本身的back键(手机本身的back键点击是会先收回软键盘,在销毁Activity)。

1、在AndroidManifest.java清单文件的标签下加入stateUnspecified。

使用环境是在ActivityB开启ActivityC,ActivityC中包含EditText,点击输入框获取焦点使软键盘弹出,然后调用自定义返回按钮执行.finish()方法,当ActivityC销毁后返回到ActivityB界面时,软键盘未回收问题,此时可以在AndroidManifest.java的ActivityB的标签下添加android:windowSoftInputMode="stateUnspecified"。

原文链接:Activity退出后,键盘不收回

注:此方案在我的项目中使用无效,在此记录。

QQ图片20191210152226.png

2、在Activity的onDestory方法中监测软键盘是否存在,存在则回收。

备注:此方法不稳定,在Activity中不包含EditText时会莫名其妙的弹起软键盘。

@Override

protected void onDestroy() {

super.onDestroy();

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

if (imm != null) {

imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

}

}

3、在.finish()前先收回软键盘

在每个Activity中调用.finish()前手动调用收回软键盘方法,此方案测试过几个页面,可以使用。在使用时最好判断软键盘是否有显示,若显示则回收,否则忽略。

@OnClick({R.id.iv_back)

void iv_depart_back(View view){

hideInput()

finish();

}

protected void hideInput() {

super.onDestroy();

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

if (imm != null) {

imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

}

}

4、自定义View,覆写dispatchKeyEventPreIme(KeyEvent event)方法

此方案未测试,针对现有的项目不好再去改动之前已经定义好的View内容,所以是新开启项目的可以尝试使用。

import android.app.Activity;

import android.content.Context;

import android.util.AttributeSet;

import android.view.KeyEvent;

import android.view.inputmethod.InputMethodManager;

import android.widget.RelativeLayout;

/**

* Finishes the containing activity on BACK, even if input method is showing.

*/

public class SearchActivityView extends RelativeLayout {

public SearchActivityView(Context context) {

super(context);

}

public SearchActivityView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public SearchActivityView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

private Activity getActivity() {

Context context = getContext();

if (context instanceof Activity) {

return (Activity) context;

} else {

return null;

}

}

/**

* Hides the input method.

*/

protected void hideInputMethod() {

InputMethodManager imm = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

if (imm != null) {

imm.hideSoftInputFromWindow(getWindowToken(), 0);

}

}

/**

* Overrides the handling of the back key to dismiss the activity.

*/

@Override

public boolean dispatchKeyEventPreIme(KeyEvent event) {

Activity activity = getActivity();

if (activity != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

KeyEvent.DispatcherState state = getKeyDispatcherState();

if (state != null) {

if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {

state.startTracking(event, this);

return true;

} else if (event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled() && state.isTracking(event)) {

hideInputMethod();

activity.onBackPressed();

return true;

}

}

}

return super.dispatchKeyEventPreIme(event);

}

}

原文链接:https://blog.csdn.net/twoicewoo/article/details/7385876

5、设置自定义的返回按钮响应系统的back键,在点击事件中执行

此方式需要在线程中执行,未进行测试。

new Thread () {

public void run () {

try {

Instrumentation inst= new Instrumentation();

inst.sendKeyDownUpSync(KeyEvent. KEYCODE_BACK);

} catch(Exception e) {

e.printStackTrace();

}

}

}.start();

原文链接:https://blog.csdn.net/qq_36487432/article/details/82226125

6、最终解决方案(方案3改良版本)

方案3中的方式可以用,但是有弊端,需要每个Activity中单独添加,如果之前在Base基类中定义过统一的关闭方式修改还是比较方便的。但是如果没有,也没关系。我们可以在Base基类中覆写finisi()方法,来关闭软键盘。

@Override

public void finish() {

super.finish();

hideKeyBoard();

}

/**

* 关闭软键盘

*/

public void hideKeyBoard() {

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

if(imm.isActive()&&getCurrentFocus()!=null){

if (getCurrentFocus().getWindowToken()!=null) {

imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

}

}

}

总结:上述方案1、2、3都测试过,在不同机型上使用效果都有差异,最后的方案6在现有的测试机上测试都可以正常显示和关闭,在此进行记录。

android 键盘收回,Activity界面销毁 软键盘未收回相关推荐

  1. Android点击返回键销毁自己,Activity界面销毁 软键盘未收回

    在项目开发过程中,界面包含EditText输入框时,输入内容时软键盘弹起.但是此时我们调用界面中自定义的返回按钮执行.finish()方法销毁Activity后发现软键盘并没有跟随关闭收回,参考了网上 ...

  2. Android 模仿QQ登录界面解决软键盘遮挡问题

    Android 软件盘弹出可能会遮挡住界面上的某些控件.当 windowSoftInputMode 为 adjustPan 时,一般不会挡住 EditText,但是假如 EditText 下面是一个登 ...

  3. Android爬坑之旅:软键盘挡住输入框问题的终极解决方式

    本文由BarryZhang原创,同一时候首发于diycode.cc.barryzhang.com .github.com/barryhappy.非商业转载请注明作者和原文链接. 前言 开发做得久了.总 ...

  4. Android爬坑之旅:软键盘挡住输入框问题的终极解决方案

    前言 开发做得久了,总免不了会遇到各种坑. 而在Android开发的路上,『软键盘挡住了输入框』这个坑,可谓是一个旷日持久的巨坑--来来来,我们慢慢看. 入门篇 Base 最基本的情况,如图所示:在页 ...

  5. 【Android】安卓开发实战之软键盘设置

    一.设置软键盘的"完成"按键 要将软键盘的可变按键设置为"完成",只要在EditText布局里加上这句话就可以了. android:imeOptions=&qu ...

  6. 【Android应用】【监听软键盘弹起与关闭】

    [背景] 在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹 ...

  7. android 手机键盘输入法,如何控制输入法软键盘的出现方式

    调用 open(null);/** * 当前弹出则关闭 * 否则弹出 * @param v */ @SuppressWarnings("static-access") public ...

  8. android隐藏软键盘方法,Android使用InputMethodManager显示和隐藏软键盘

    Android主要用InputMethodManager来对软键盘进行管理.手动显示或隐藏软键盘前需要先获取InputMethodManager. InputMethodManager imm = ( ...

  9. android EditText取消焦点且退出软键盘

    android EditText取消焦点且退出软键盘 最近发现,如果在一个activity中直接加入EditText的话,每次打开这个activity的时候,就会自动打开软键盘,并且点哪里都取消不了. ...

最新文章

  1. three20 阅读到的代码
  2. initMNN: init numpy failed mnn笔记
  3. Electron通过ffi调用DLL
  4. shell脚本编译规范(编写第一个脚本,脚本变量的作用,类型 ,了解read命令,let命令,环境变量和预定义变量)
  5. cf1207解题报告
  6. redis 远程主机强迫关闭了一个现有的连接_记一次Redis+Getshell经验分享
  7. Kubernetes 的原理
  8. Mac os区别_SN及Mac地址烧录
  9. popen 如何获取指令执行情况_Linux下使用popen()执行shell命令
  10. 爬虫登录获取cookie的难点
  11. html 父模板,详解vue父子模版嵌套案例
  12. 给 VS2008 / VS2010 MFC 项目添加启动画面
  13. VB.NET外部程序调用总结下
  14. 关于shopex网店系统和网店助理的几点优化建议
  15. Davids实操笔记:Spring Boot使用docker整合ElasticSearch ik分词搜索和拼音搜索
  16. 写确认/Write Acknowledgment(Write Concern)
  17. python_模块_包
  18. abp过滤规则android,ABP的数据过滤器(Data Filters)
  19. 微信小程序开发笔记二(WXSS和CSS样式美化)
  20. Android Studio 中的maven仓库使用

热门文章

  1. dvorak在win 和Linux中文输入法的日常用法
  2. 为什么要在项目中使用缓存呢?
  3. 将frpc注册成windows系统服务
  4. Pycharm导包失败
  5. 了解工业物联网吗?工业物联网感知层、现场管理层、网络层介绍
  6. 用FastAPI加爬虫制作一个涩图API,521就这样自己过。
  7. FANUC UIO 发那科专用IO定义说明
  8. 4455: [Zjoi2016]小星星
  9. 【51单片机】独立按键控制LED灯(四种形式)
  10. Fluent Meshing分离边界层网格