大家都知道的使软键盘消失的方法很简单 如下
-
<span style="font-size:24px;">InputMethodManager imm = (InputMethodManager) getSystemService( -
INPUT_METHOD_SERVICE); -
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);</span>
当然我知道你想要的是点击空白地方使输入框消失代码如下
可以在activity中重写onTouchEvent
-
// 点击空白区域 自动隐藏软键盘 -
public boolean onTouchEvent(MotionEvent event) { -
if(null != this.getCurrentFocus()){ -
/** -
* 点击空白位置 隐藏软键盘 -
*/ -
InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); -
return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); -
} -
return super .onTouchEvent(event); -
}
在fragment中由于没有onTouchEvent重写所以可以在onCreateView中,对view使用以下方法
-
view.setOnTouchListener(new OnTouchListener() { -
@Override -
public boolean onTouch(View v, MotionEvent event) { -
InputMethodManager manager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); -
if(event.getAction() == MotionEvent.ACTION_DOWN){ -
if(getActivity().getCurrentFocus()!=null && getActivity().getCurrentFocus().getWindowToken()!=null){ -
manager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); -
} -
} -
return false; -
} -
});
或者在activity中重写onTouchEvent然后在fragment中调用如下方法
-
view.setOnTouchListener(new View.OnTouchListener() { -
@Override -
public boolean onTouch(View v, MotionEvent event) { -
getActivity().onTouchEvent(event); -
return false; -
} -
});
上面的问题都不大,但是当你的activity或者fragment中包含scrollview的时候,你会发现你的onTouchEvent()根本不会得到调用,这个时候你就慌了,接着你会去想方法设法的实现touch,click,focus监听,然而你会发现然并卵,你就会去思考,能不能重写scrollview来拦截touch事件,然而你会发现仍然是然并卵,那么到底如何解决呢?
步骤如下
1一个公共的方法 用来隐藏软键盘
-
public static void hideSoftKeyboard(Activity activity) { -
InputMethodManager inputMethodManager = -
(InputMethodManager) activity.getSystemService( -
Activity.INPUT_METHOD_SERVICE); -
inputMethodManager.hideSoftInputFromWindow( -
activity.getCurrentFocus().getWindowToken(), 0); -
}
2,在BaseActivity中或者BaseFragment中这样来调用,当然这里你要区分获得当前使用的是哪个activity或者哪个fragment(如何确定当前是哪个fragment这个可以定义接口来回调就好)---当然你也可以在你需要的activity或fragment中直接调用这种方式不推荐
-
public void setupUI(View view) { -
// Set up touch listener for non-text box views to hide keyboard. -
if (!(view instanceof EditText)) { -
view.setOnTouchListener(new OnTouchListener() { -
public boolean onTouch(View v, MotionEvent event) { -
hideSoftKeyboard(MyActivity.this); -
return false; -
} -
}); -
} -
//If a layout container, iterate over children and seed recursion. -
if (view instanceof ViewGroup) { -
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { -
View innerView = ((ViewGroup) view).getChildAt(i); -
setupUI(innerView); -
} -
} -
}
注意:在fragment中你可以直接将onCreateView中的view传递到setupUI的参数当中
对于为什么包含scrollview的activity和fragment会不调用onTouch事件,后续会在研究过scrollview源码之后在此博客内容下补充,当然也欢迎大神来帮忙解答,么么哒~.~
本文详细介绍在Android应用中隐藏软键盘的多种方法,包括在Activity和Fragment中通过代码实现点击空白处关闭键盘,以及针对ScrollView存在的问题提供解决方案。
1163

被折叠的 条评论
为什么被折叠?



