做网站时的兼容问题,南阳移动端网站制作,wordpress 漂亮的博客,什么网站可以做报名系统在项目开发过程中#xff0c;界面包含EditText输入框时#xff0c;输入内容时软键盘弹起。但是此时我们调用界面中自定义的返回按钮执行.finish()方法销毁Activity后发现软键盘并没有跟随关闭收回#xff0c;参考了网上各种方法后#xff0c;试验总结出自己项目中可用的方案…在项目开发过程中界面包含EditText输入框时输入内容时软键盘弹起。但是此时我们调用界面中自定义的返回按钮执行.finish()方法销毁Activity后发现软键盘并没有跟随关闭收回参考了网上各种方法后试验总结出自己项目中可用的方案。注意此篇记录的是调用.finish()返回时软键盘未回收问题而非手机本身的back键(手机本身的back键点击是会先收回软键盘在销毁Activity)。1、在AndroidManifest.java清单文件的标签下加入stateUnspecified。使用环境是在ActivityB开启ActivityCActivityC中包含EditText点击输入框获取焦点使软键盘弹出然后调用自定义返回按钮执行.finish()方法当ActivityC销毁后返回到ActivityB界面时软键盘未回收问题此时可以在AndroidManifest.java的ActivityB的标签下添加android:windowSoftInputModestateUnspecified。注此方案在我的项目中使用无效在此记录。B界面设置android:windowSoftInputMode键盘是否自动回收stateUnspecified✓stateUnchanged✗stateHidden✗stateAlwaysHidden✗stateVisible✗stateAlwaysVisible✓stateHidden✗不指定✓2、在Activity的onDestory方法中监测软键盘是否存在存在则回收。备注此方法不稳定在Activity中不包含EditText时会莫名其妙的弹起软键盘。Overrideprotected 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.*/Overridepublic 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()方法来关闭软键盘。Overridepublic 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在现有的测试机上测试都可以正常显示和关闭在此进行记录。