android 键盘收回,Activity界面销毁 软键盘未收回
一、在项目开发过程中,界面包含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界面销毁 软键盘未收回相关推荐
- Android点击返回键销毁自己,Activity界面销毁 软键盘未收回
在项目开发过程中,界面包含EditText输入框时,输入内容时软键盘弹起.但是此时我们调用界面中自定义的返回按钮执行.finish()方法销毁Activity后发现软键盘并没有跟随关闭收回,参考了网上 ...
- Android 模仿QQ登录界面解决软键盘遮挡问题
Android 软件盘弹出可能会遮挡住界面上的某些控件.当 windowSoftInputMode 为 adjustPan 时,一般不会挡住 EditText,但是假如 EditText 下面是一个登 ...
- Android爬坑之旅:软键盘挡住输入框问题的终极解决方式
本文由BarryZhang原创,同一时候首发于diycode.cc.barryzhang.com .github.com/barryhappy.非商业转载请注明作者和原文链接. 前言 开发做得久了.总 ...
- Android爬坑之旅:软键盘挡住输入框问题的终极解决方案
前言 开发做得久了,总免不了会遇到各种坑. 而在Android开发的路上,『软键盘挡住了输入框』这个坑,可谓是一个旷日持久的巨坑--来来来,我们慢慢看. 入门篇 Base 最基本的情况,如图所示:在页 ...
- 【Android】安卓开发实战之软键盘设置
一.设置软键盘的"完成"按键 要将软键盘的可变按键设置为"完成",只要在EditText布局里加上这句话就可以了. android:imeOptions=&qu ...
- 【Android应用】【监听软键盘弹起与关闭】
[背景] 在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹 ...
- android 手机键盘输入法,如何控制输入法软键盘的出现方式
调用 open(null);/** * 当前弹出则关闭 * 否则弹出 * @param v */ @SuppressWarnings("static-access") public ...
- android隐藏软键盘方法,Android使用InputMethodManager显示和隐藏软键盘
Android主要用InputMethodManager来对软键盘进行管理.手动显示或隐藏软键盘前需要先获取InputMethodManager. InputMethodManager imm = ( ...
- android EditText取消焦点且退出软键盘
android EditText取消焦点且退出软键盘 最近发现,如果在一个activity中直接加入EditText的话,每次打开这个activity的时候,就会自动打开软键盘,并且点哪里都取消不了. ...
最新文章
- three20 阅读到的代码
- initMNN: init numpy failed mnn笔记
- Electron通过ffi调用DLL
- shell脚本编译规范(编写第一个脚本,脚本变量的作用,类型 ,了解read命令,let命令,环境变量和预定义变量)
- cf1207解题报告
- redis 远程主机强迫关闭了一个现有的连接_记一次Redis+Getshell经验分享
- Kubernetes 的原理
- Mac os区别_SN及Mac地址烧录
- popen 如何获取指令执行情况_Linux下使用popen()执行shell命令
- 爬虫登录获取cookie的难点
- html 父模板,详解vue父子模版嵌套案例
- 给 VS2008 / VS2010 MFC 项目添加启动画面
- VB.NET外部程序调用总结下
- 关于shopex网店系统和网店助理的几点优化建议
- Davids实操笔记:Spring Boot使用docker整合ElasticSearch ik分词搜索和拼音搜索
- 写确认/Write Acknowledgment(Write Concern)
- python_模块_包
- abp过滤规则android,ABP的数据过滤器(Data Filters)
- 微信小程序开发笔记二(WXSS和CSS样式美化)
- Android Studio 中的maven仓库使用