OnTouch关于performClick的Warning

OnTouch关于performClick的WarningOnTouch关于performClick的Warning当你对一个控件(例如FloatingActionButton)使用setOnTouchListener()或者是对你的自定义控件重写onTouchEvent方法时会出现这个警告,警告内容全文如下IfaViewthatoverridesonTouchEventorusesanOnTouchListenerd…

大家好,又见面了,我是你们的朋友全栈君。

OnTouch关于performClick的Warning

当你对一个控件(例如FloatingActionButton)使用setOnTouchListener() 或者是对你的自定义控件重写onTouchEvent方法时会出现这个警告,警告内容全文如下

If a View that overrides onTouchEvent or uses an OnTouchListener does not also implement performClick and call it when clicks are detected, the View may not handle accessibility actions properly. Logic handling the click actions should ideally be placed in View#performClick as some accessibility services invoke performClick when a click action should occur.

大概的意思是说

如果一个覆盖了onTouchEvent方法或者使用了OnTouchListener的控件没有引用performClick并且调用它的点击事件被拦截,控件可能不能合适的处理访问操作。逻辑上来讲处理点击操作应该更合理的被放置在View#performClick中,这样当点击事件发生时一些访问性操作可以成功请求调用performClick。

这段话各种从句太多了,费了好大劲才弄懂什么意思翻译出来。

可能意思还是不太明了,再说明一下:当你添加了一些点击操作,例如像setOnClickListener这样的,它会调用performClick才可以完成操作,但你重写了onTouch,就有可能把performClick给屏蔽了,这样这些点击操作就没办法完成了,所以就会有了这个警告。

我们来探究一下这个Warning出现的具体原因。

在View中找到onTouchEvent的源码,在ACTION_UP中可以找到这一段

if (mPerformClick == null) {
      mPerformClick = new PerformClick();
}
if (!post(mPerformClick)) {
    performClick();
}

继续查找PerformClick()和performClick()的源码

  private final class PerformClick implements Runnable { 
   
        @Override
        public void run() {
            performClick();
        }
    }
  public boolean performClick() {
        final boolean result;
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            result = true;
        } else {
            result = false;
        }

        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

        notifyEnterOrExitForAutoFillIfNeeded(true);

        return result;
    }

可以看到在onTouchEvent的ACTION_UP过程中启用了一个新的线程来调用performClick(),而performClick()的作用时调用你在setOnClickListener时设置的onClick()方法。

一般来说这个警告都是可以忽略不用管他的,毕竟我们在自定义控件时很少会在重写了onTouchEvent后再使用setOnClickListener,这个警告主要是考虑到其他人在使用这个控件时调用这个方法,如果强迫症看着难受的话可以使用下面的方法来解决这个问题:

1 如果你是在控件内重写onTouchEvent()时遇到了这个警告,控件内直接重写performClick()方法外,还要在onTouchEvent()的ACTION_UP(DOWN其实也可以)添加performClick()的使用

@Override
    public boolean performClick() {
        return super.performClick();
    }
if (action == MotionEvent.ACTION_UP) {
        performClick(); 

或者:

public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    break;

                case MotionEvent.ACTION_CANCEL:
                    break;

                 case MotionEvent.ACTION_UP:
                    performClick();
                    break;
            }
        return true;
    }

这样应该就OK了。

2 如果你在setOnTouchListener时遇到这个Warning,那么除了在控件内重写performClick()外,也需要在onTouch()中调用performClick():

button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        break;
                    case MotionEvent.ACTION_UP:
                        button.performClick();
                        break;
                }
                return false;
            }
        });

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148908.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月16日 下午1:00
下一篇 2022年6月16日 下午1:00


相关推荐

  • 大盘进入极度敏感区域

    大盘进入极度敏感区域《比技术面更重要的三个信息》,其中所说的三点都是凌驾于技术面的东西。非常重要,也必须时刻关注。如果股市变化通过看看K线,看看技术指标就能够掌握全局变化,那就是大笑话了。 现在,那篇评论里谈到的第一个问题就有了明显变化,美圆指数连续收出三根红K线,并且已有突破从09年3月形成的下降趋势的迹象。 和这个迹象紧密相连的另外一个变化就是石油、黄金价格持续下跌。这…

    2022年6月29日
    24
  • Ubuntu20.04安装cuda cudnn pytorch pycharm记录

    Ubuntu20.04安装cuda cudnn pytorch pycharm记录Ubuntu20.04安装cudacudnnpytorchpycharm记录0.安装NVIDIA驱动1.安装cuda(1)查看pytorch支持的cuda版本。(2)下载cuda安装包并安装2.安装cudnn3.安装Anaconda(略)4.conda换源、建立环境、pip换源(1)conda换源(2)建立conda环境(3)pip换源5.在环境中安装pytorch6.安装pycharm记录时间:2021年1月31日版本:Ubuntu20.04、cuda11.0、cudnn对应的版本、pytorc

    2025年7月27日
    4
  • 《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写

    《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写

    2022年3月7日
    47
  • 【算法】详解动态规划

    【算法】详解动态规划nbsp nbsp 首先学习动态规划 我们的先知道什么是动态规划 算法导论这本书是这样介绍这个算法的 动态规划与分治方法类似 都是通过组合子问题的解来来求解原问题的 再来了解一下什么是分治方法 以及这两者之间的差别 分治方法将问题划分为互不相交的子问题 递归的求解子问题 再将它们的解组合起来 求出原问题的解 而动态规划与之相反 动态规划应用与子问题重叠的情况 即不同的子问题具有公共的子子问

    2026年3月19日
    2
  • MAC电脑 系统 恢复出厂设置

    MAC电脑 系统 恢复出厂设置具体步骤:1首先开启Mac的电源开关,同时按住command+R键进入恢复模式,我们就能看MacOSX实用工具。2选择磁盘工具–然后选择上面一般是MacintoshHD这个选项,右侧选择抹掉。意思就是删除所有内容重新安装新的系统。3重新启动Mac,这时出现地球标志,等待更新完成。这里PC6小编要提醒各位进行这项操作的Mac用户,由于在线恢复需要从苹果服务器下载完整的OS

    2022年6月21日
    34
  • webpack path和publicPath作用

    webpack path和publicPath作用path 用来存放打包后文件的输出目录 publicPath 指定资源文件引用的目录用处 例如在 express 中 指定了 public dist 是网站的根目录 网站的源文件存放在 public 中 那么就需要设置 path dist 指定打包输出到该目录 而 publicPath 就需要设置为 表示当前路径 publicPath 取决于你的网站根目录的位置 因为打包的文件都在网站根目录了 这

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号