最近在开始学习自定义的View, 想在自定义的View中监听onKeyDown事件,处理一些逻辑。发现基类View中有该函数,于是重写它。
然后在MainActivity中调用setContentView。
View contentView = new CustomView(this);
setContentView(contentView);
CustomView继承View重写onKeyDown函数,结果发现它的onKeyDown函数没有执行。。
在网上找了点资料:原来是焦点的问题。我们的程序运行时默认的焦点是在Activity上,而View没有获得焦点,所以它的onKeyDown函数监听不到。
既然是这样,那应该让View获取到焦点就可以了监听了。
修改为
View contentView = new CustomView(this);
contentView.setFocusable(true);
contentView.setFocusableInTouchMode(true);
setContentView(contentView);
或者在CustomView的构造函数中加上设置焦点的两句也可以让View获取到焦点。
setFocusable(true): 设置View能够获取到焦点。
setFocusableInTouchMode():设置是否有焦点来响应点触的资格
测试过程中发现会先执行View的onKeyDown事件,然后再执行Activity的,所以我们可以在View中的onKeyDown中返回false,来屏蔽掉Activiy中的对应事件。