今天做了个页面,上方是个GridView,下方是个LinearLayout,当点击下方的LinearLayout中的控件时,响应的是GridView的item事件,在网上查找了各种方法,什么事件穿透,GridView空白点击,都不起作用。先把点击GridView空白区域(空白区域指的是GridView的
horizontalSpacing
和
verticalSpacing
部分,不是指GridView以外的部分,我就犯了这个错误)的事件响应整理一下,以供以后参考:
public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public interface OnTouchInvalidPositionListener { /** * motionEvent 可使用 MotionEvent.ACTION_DOWN 或者 MotionEvent.ACTION_UP等来按需要进行判断 * @return 是否要终止事件的路由 */ boolean onTouchInvalidPosition(int motionEvent); } OnTouchInvalidPositionListener mTouchInvalidPosListener; /** * 点击空白区域时的响应和处理接口 */ public void setOnTouchInvalidPositionListener(OnTouchInvalidPositionListener listener) { mTouchInvalidPosListener = listener; } @Override public boolean onTouchEvent(MotionEvent event) { if(mTouchInvalidPosListener == null) { return super.onTouchEvent(event); } if (!isEnabled()) { // A disabled view that is clickable still consumes the touch // events, it just doesn't respond to them. return isClickable() || isLongClickable(); } if(event.getActionMasked() == MotionEvent.ACTION_UP) { final int motionPosition = pointToPosition((int)event.getX(), (int)event.getY()); if( motionPosition == INVALID_POSITION ) { super.onTouchEvent(event); return mTouchInvalidPosListener.onTouchInvalidPosition(event.getActionMasked()); } } return super.onTouchEvent(event); } }
activity中
gv_cookbook=(MyGridView)findViewById(R.id.gv_cookbook); gv_cookbook.setOnTouchInvalidPositionListener(new MyGridView.OnTouchInvalidPositionListener() { @Override public boolean onTouchInvalidPosition(int motionEvent) { Logger.t(TAG).d("touch"); return true; } });