项目中需要就顺便研究了一下俩种方法,网络上多为方法二,但本人验证存在问题,可能自己的方法不正确,欢迎留言指正。
方案一:采用事件监听的方式
1.给activity布局文件加入
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
android:id="@+id/activity_main"
>
2:按照一般控件的方式进行事件监听。
activity_main=(LinearLayout) findViewById(R.id.activity_main);
activity_main.setOnTouchListener(new OnTouchListener()
{
public boolean onTouch(View arg0, MotionEvent arg1)
{
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
return imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
});
方案二:采用基于回调的方法
这种基于回调的方法是对activity中俩个函数的重写,所以说要想实现对全部屏幕的其他操作,所有的action_down操作被检测到,后续操作也需要修改一下。
目前思路仍是不怎么清晰,考虑对主layout重构继承一个Linearlayout,重写里面的onInterceptTouchEvent。这样ViewGroup就可以截获到消息。未进行验证。
下面是网上方法。
dispatchTouchEvent是用来分发事件的,onTouchEvent是用来处理事件
单独采用2(网上大部分都是这种),我这边根本就不能够实现调用,日志不会输出其中的内容;
单独采用1,则点击activity中其他控件也会做出相应的响应,点击edittext就不能完成输入操作,所以不可取。
二者相结合,在dispatch中调用2,效果与单独采用dispatch相同。
1.@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
// TODO Auto-generated method stub
Log.v("mmmmmmm", "bbbbbbbbbb");
if(ev.getAction() == MotionEvent.ACTION_DOWN)
{
if(getCurrentFocus()!=null && getCurrentFocus().getWindowToken()!=null)
{
InputMethodManager manager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
return super.onTouchEvent(ev);
}
2. @Override
public boolean onTouchEvent(android.view.MotionEvent event)
{
Log.v("wwwww", "bbbbbbbbbb");
Toast.makeText(getBaseContext(), "How dare you touch me", Toast.LENGTH_SHORT).show();
InputMethodManager manager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if(event.getAction() == MotionEvent.ACTION_DOWN){
if(getCurrentFocus()!=null && getCurrentFocus().getWindowToken()!=null){
manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
return super.onTouchEvent(event);
}//基于回调的事件处理模型。
关于dispatchtouchevent与ontouchevent的详细探讨会在下面文章继续。