都知道在开发过程touch事件传递是件很复杂的事,那么key事件呢,它相对来说简单一点。
今天在开发时有这样一个需求,就是在EditText中输入文字,然后监听回车键跳转。
那么我这个监听是写在哪里呢?
Activity?承载这个EditText的Viewgroup?还是写给EditText 这个View本身
另外是用dispatchkey?onkeydown?onkeyup?还是View本身的onKey?
进过尝试发现:在有Edittext的Viewgroup中,Edittext获得焦点时,key事件是这样分发的
1. 首先是数字或字符等普通字符,是直接给EditText处理的,是不对外的。但是删除,回车是对外的
2. 这两个特殊字符首先是先给View本身的onKey,如果不处理(返回false),才由EditText自己处理的
所以针对上面的需求,我们只需要对View本身监听onKeyListener,然后在里面监听回车键,处理事情,并且返回true即可。
扩展,,,,
如果没有EditText或者EditText没有获取焦点呢,事件是怎么传递的呢?
1. 如果是在Viewgroup中处理,首先是Viewgroup默认不处理onkeydown事件,我们如果需要来一个总体的事件分发,可以用dispatchKeyEvent,如果返回true,就不会传给child。否则可以传给child
2. 如果是在Activity中处理,我们可以写dispatchKeyEvent和onKeyDown,如果dispatchKeyEvent返回true,那么不会再给onKeyDown处理,否则还是会先dispatch处理,然后onkeydown处理