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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最新VMware 安装Windows10——图文操作,超详细~~~「建议收藏」

    最新VMware 安装Windows10——图文操作,超详细~~~「建议收藏」VMware安装win10系统之前一直卡在找不到映像文件和开机需要登陆密码之个步骤,后续又卡在了设置,干脆自己梳理了下具体步骤,防止再次踩坑~

    2022年6月16日
    22
  • maven 环境配置详细步骤[通俗易懂]

    maven 环境配置详细步骤[通俗易懂]maven环境配置前言环境配置步骤本地仓库配置新建一个maven项目与其环境配置前言maven是一个项目自动构建工具,环境配置步骤1、首先去官网下载maven安装包:http://maven.apache.org/download.cgi2、配置maven环境变量如上图配置MAVEN_HOME和M2_HOME,其内容是maven的安装路径(不要有中文!)3、修改path添加maven相关路径在path中配置jdk的环境变量后面加上两条:%MAVEN_HOME%\bin%M2_HOME

    2022年5月14日
    56
  • ajax跨域请求jsonp完整示例

    ajax跨域请求jsonp完整示例最经用到jsonp(ajax)的跨域请求,在这分享给大家,有需要用到的一看就能明白。具体步骤如下:1.首先客户端即页面script中调用代码如下:        varcardNumber="***********"; $.ajax({ type:"GET", url:’你请求的服务地址?idCard=’+cardNumber, dataType:…

    2022年6月17日
    100
  • 2268大约是多少_情态动词过去式

    2268大约是多少_情态动词过去式小 Q 在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字 1,2,3… 进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存在一条通路(通路指连接两个元件的导线序列)。在电路板上存在一个特殊的元件称为“激发器”。当激发器工作后,产生一个激励电流,通过导线传向每一个它所连接的节点。而中间节点接收到激励电流后,得到信息,并将该激励电流传向与它连接并且尚未接收到激励电流的节点。最终,激励电流将到达一些“终止节点”——

    2022年8月9日
    3
  • pytorch安装-国内镜像源

    pytorch安装-国内镜像源在安装好cuda和cudnn之后安装pytorch的方法网上很多的方法都不是镜像下载,或者镜像下载因为系统的问题找不到库打开官网,找到对应合适的版本(cuda):https://pytorch.org/get-started/locally/之后复制下面这一行指令:condainstallpytorchtorchvisiontorchaudiocudatoolkit=11.0-cpytorch接下来就是关键一步了,把-cpytorch表示的pytorch源,更改为国内的镜像。

    2022年6月24日
    56
  • safari每次打开都是上次未关闭页面_页码一直不变怎么改

    safari每次打开都是上次未关闭页面_页码一直不变怎么改bootstrapTable刷新当前页码不变和从第一页开始查询

    2022年4月20日
    54

发表回复

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

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