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!

       

  • 相关阅读:
    python信息收集(二)
    python信息收集(一)
    'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte
    Loadruner 之 controller 负载生成器与场景运行——性能测试
    chromedriver 在pycharm 中的使用
    selenium 安装
    在Linux 中搭建 Mysql
    前端攻略
    2020-5-22 第二期——拖延症
    2020-5-15 第一期
  • 原文地址:https://www.cnblogs.com/gangmiangongjue/p/4984117.html
Copyright © 2011-2022 走看看