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

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

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

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

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

B界面设置android:windowSoftInputMode

键盘是否自动回收

stateUnspecified

stateUnchanged

stateHidden

stateAlwaysHidden

stateVisible

stateAlwaysVisible

stateHidden

不指定

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

}

}

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

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

new Thread () {

public void run () {

try {

Instrumentation inst= new Instrumentation();

inst.sendKeyDownUpSync(KeyEvent. KEYCODE_BACK);

} catch(Exception e) {

e.printStackTrace();

}

}

}.start();

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. 邱与他的bug——Android中点击返回键重新刷新的问题

    问题 在进入手机"运存与存储空间"的时候,第一次进去会刷新4秒,显示正在加载,在进入后查看某一具体类型的(视频.音乐.图片)占用内存情况,进入查看后,再次点击返回键的时候,会重新加 ...

  2. android 点击返回键home,android Home键和返回键

    在Android中,当按下Home键,默认情况下stop前台的actiity,即activity设置成onstop,而不是ondestory.如果再次启动该activity不是调用onCreate,而 ...

  3. android 键盘收回,Activity界面销毁 软键盘未收回

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

  4. android 点击返回按钮退回桌面的时候销毁了应用

    发现一个奇异的bug,可能是系统版本高android11的原因吧,当应用回退栈为0的时候,按返回按钮会退回桌面,正常来说只是让应用返回后台而已,但是在楼主手机却出现了应用被销毁的问题,随即找到了解决方 ...

  5. android 点击返回键home键,appium怎么按下系统按键?如按下返回键、home键等等

    ava_client3.0版本以后使用pressKeyCode方法,之前的版本使用sendKeyEvent方法 1. 返回:driver.pressKeyCode(AndroidKeyCode.BAC ...

  6. android fragment点击返回键实现内容切换?

    ============问题描述============ 我有一个fragment,上有一个button和textview,默认button是隐藏的,通过点击菜单栏上的一个详细信息的按钮,将butto ...

  7. 连续点击返回键退出Android 应用

    问题 业务需要,在主界面连续点击返回键退出应用,记录一下. 解决方案 先说结论,在主界面Activity中添加如下代码 /*** 记录上次点击返回键时间*/private long lastClick ...

  8. Android实现点击返回键返回桌面而不是退出程序

    有时候我们的应用我们希望他点击一次返回键的时候不是退出应用而是返回到桌面,比如像QQ和微信等聊天软件,在主界面点击返回键的时候不是退出应用而是返回到桌面,那么怎么能够实现这种需求呢?其实也很简单,只需 ...

  9. 点击返回键,将应用退至后台运行

    问题 我看到网上很多方案都是这样: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == K ...

最新文章

  1. 浅析深度学习中Batch Size大小对训练过程的影响
  2. iphone11系统输入框的光标位置不正常
  3. 三十八、学Sql,不了解Sql注入怎么行?
  4. SAP Fiori Elements List Report Smart Table Toolbar 的 XML 视图实现
  5. spring mvc ajax 400解决
  6. JAVA入门级教学之(类之间究竟有哪几种关系呢)
  7. 真正好的东西,就会脱颖而出
  8. Matlab仿真产生复高斯白噪声,验证包络服从瑞利分布,包络平方服从指数分布
  9. 习题第一章 构造过程抽象
  10. 设计模式在游戏中的应用--模板方法(七)
  11. php100视频教程下载(全集),下载地址链接(整理后包涵解压密码)
  12. Chrome浏览器插件之---FeHelper
  13. 极大似然估计法(Maximum likelihood estimation, MLE)
  14. 【统计学】原假设 备择假设 对立假设 p值与检验统计量
  15. c 语言编程字谜,C语言猜字谜游戏
  16. 【MATLAB】创建网格图和曲面图
  17. 学车考试技巧(图解)
  18. SPSS李克特五点计分调查问卷的选项如何设置?【SPSS 066期】
  19. 手机上如何学会使用计算机,手机如何投屏到win7电脑上_手机投屏到win7电脑的详细方法...
  20. 双目视觉三维重建框架

热门文章

  1. php date 有warning,php提示PHP Warning: date(): It is not safe to rely on the......错误的解决办法...
  2. oracle move 换用户,Oracle move方法释放delete后的表空间
  3. ef mysql 的坑_C# EF 与 MySql 的那些坑
  4. android访问重定向地址,如何从android中重定向url加载图像(示例代码)
  5. apple quicktime怎么在ppt中用_PPT情感专题大赏No. 007:一份这就是街舞第三季主题PPT(上集)...
  6. g标签 怎么设置svg_SVG g元素
  7. pcb天线和纯铜天线_如何简化天线设计?相控阵波束成形IC来助您
  8. 获取html内标题,通过html敏捷包获取标题标签
  9. C++11新特性之左值右值及移动语句与完美转发
  10. 127.0.0.1与localhost的区别