关于activity和fragment中点击edittext之外的空白区域使软键盘消失的解决办法

大家都知道的使软键盘消失的方法很简单 如下

 
  1. InputMethodManager imm = (InputMethodManager) getSystemService(

  2. INPUT_METHOD_SERVICE);

  3. imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

 

当然我知道你想要的是点击空白地方使输入框消失代码如下

可以在activity中重写onTouchEvent

 

 
  1. // 点击空白区域 自动隐藏软键盘

  2. public boolean onTouchEvent(MotionEvent event) {

  3. if(null != this.getCurrentFocus()){

  4. /**

  5. * 点击空白位置 隐藏软键盘

  6. */

  7. InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

  8. return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);

  9. }

  10. return super .onTouchEvent(event);

  11. }

 

 

 

在fragment中由于没有onTouchEvent重写所以可以在onCreateView中,对view使用以下方法

 

 
  1. view.setOnTouchListener(new OnTouchListener() {

  2.  
  3. @Override

  4. public boolean onTouch(View v, MotionEvent event) {

  5.  
  6. InputMethodManager manager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

  7. if(event.getAction() == MotionEvent.ACTION_DOWN){

  8. if(getActivity().getCurrentFocus()!=null && getActivity().getCurrentFocus().getWindowToken()!=null){

  9. manager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

  10. }

  11. }

  12. return false;

  13. }

  14. });

或者在activity中重写onTouchEvent然后在fragment中调用如下方法

 

 
  1. view.setOnTouchListener(new View.OnTouchListener() {

  2. @Override

  3. public boolean onTouch(View v, MotionEvent event) {

  4. getActivity().onTouchEvent(event);

  5. return false;

  6. }

  7. });


 

 

上面的问题都不大,但是当你的activity或者fragment中包含scrollview的时候,你会发现你的onTouchEvent()根本不会得到调用,这个时候你就慌了,接着你会去想方法设法的实现touch,click,focus监听,然而你会发现然并卵,你就会去思考,能不能重写scrollview来拦截touch事件,然而你会发现仍然是然并卵,那么到底如何解决呢?

步骤如下

1一个公共的方法 用来隐藏软键盘

 

 
  1. public static void hideSoftKeyboard(Activity activity) {

  2. InputMethodManager inputMethodManager =

  3. (InputMethodManager) activity.getSystemService(

  4. Activity.INPUT_METHOD_SERVICE);

  5. inputMethodManager.hideSoftInputFromWindow(

  6. activity.getCurrentFocus().getWindowToken(), 0);

  7. }

2,在BaseActivity中或者BaseFragment中这样来调用,当然这里你要区分获得当前使用的是哪个activity或者哪个fragment(如何确定当前是哪个fragment这个可以定义接口来回调就好)---当然你也可以在你需要的activity或fragment中直接调用这种方式不推荐

 
  1. public void setupUI(View view) {

  2.  
  3. // Set up touch listener for non-text box views to hide keyboard.

  4. if (!(view instanceof EditText)) {

  5. view.setOnTouchListener(new OnTouchListener() {

  6. public boolean onTouch(View v, MotionEvent event) {

  7. hideSoftKeyboard(MyActivity.this);

  8. return false;

  9. }

  10. });

  11. }

  12.  
  13. //If a layout container, iterate over children and seed recursion.

  14. if (view instanceof ViewGroup) {

  15. for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {

  16. View innerView = ((ViewGroup) view).getChildAt(i);

  17. setupUI(innerView);

  18. }

  19. }

  20. }

注意:在fragment中你可以直接将onCreateView中的view传递到setupUI的参数当中
 

对于为什么包含scrollview的activity和fragment会不调用onTouch事件,后续会在研究过scrollview源码之后在此博客内容下补充,当然也欢迎大神来帮忙解答,么么哒~.~

你可能感兴趣的:(android)