zoukankan      html  css  js  c++  java
  • android 你的onfocuschangelistener和android:state_hovered为何不起作用

        首先公布本人的测试结果,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!

       

  • 相关阅读:
    #256 (Div. 2)A. Rewards
    1113 矩阵快速幂
    1108 距离之和最小V2
    1287 加农炮
    1191 消灭兔子
    1051 最大子矩阵
    1086 背包
    1105 第K大的数
    2016 CCPC 网络赛 B 高斯消元 C 树形dp(待补) G 状压dp+容斥(待补) H 计算几何
    Educational Codeforces Round 18 C dp,思维 D lowbit,思维
  • 原文地址:https://www.cnblogs.com/gangmiangongjue/p/4984117.html
Copyright © 2011-2022 走看看