首先公布本人的测试结果,android里边除了edittext给它绑定onfocuschangelistener之后,会返回true,其他的组件一律没反应,除非你调用了requestfocus,但即使你调用了requestfocus以后,onfocuschangelistener依然会给你返回false,网上许多帖子对focus的问题都似是而非,于是本人决定从源码中找答案,找了半天只从textview里找到了一些蛛丝马迹:
@Override public boolean onTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); if (mEditor != null) mEditor.onTouchEvent(event);
而mEditor声明是在此处:
private Editor mEditor;
而这个Editor类到底是什么东西,源码的线索是中断了的,但起码说明一点,edittext(edittext比一般的textview多一个Editor)的处理逻辑跟一般的textview是不一样的,而且很可能是写了改变了focus的逻辑。
又测试了两种场合,一种是一个页面中只有一个edittext,给它绑定onfocuschangelistener之后,点击页面的其他区域,focuslistener是没有任何反应的;第二种场合,多个edittext之间轮流点击,onfocuschangelistener竟然神奇地起了作用 。
最后我再国外的一个论坛里找到了合理的答案:
其实仔细想想,之前编写selector时候android:state_hovered这个属性设置了也是不起作用,后来查老外的说法才发现是针对鼠标的,然后自己不信邪,给平板插了鼠标,果然是起作用了,这个focus也是同样的道理,不过基于edittext的特殊性(edittext是自带光标的),android给了edittext特例,虽然找不到源码,但是 我们可以猜想:mEditor.onTouchEvent(event)中是做了改变焦点的逻辑的。
截图最后一个同学的观点我十分赞同,不得不附和一句: This Nappy Guy comment is just proof to me that the Android API is complete garbage!