我try 了所有这些解决方案.edc598是最接近工作的,但在布局中包含的其他View
个上没有触发touch 事件.如果有人需要这种行为,我最后就是这么做的:
我创建了一个名为touchInterceptor的(不可见)FrameLayout
作为布局中的最后一个View
,因此它覆盖了所有内容(edit:您还必须使用RelativeLayout
作为父布局,并赋予touchInterceptor fill_parent
属性).然后我用它来拦截触碰,并确定触碰是否在EditText
之上:
FrameLayout touchInterceptor = (FrameLayout)findViewById(R.id.touchInterceptor);
touchInterceptor.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (mEditText.isFocused()) {
Rect outRect = new Rect();
mEditText.getGlobalVisibleRect(outRect);
if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
mEditText.clearFocus();
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
}
return false;
}
});
返回false以使touch 处理失败.
这很有意思,但这是唯一对我有用的东西.