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


相关推荐

  • golang deepcopy_mongodb主从复制原理

    golang deepcopy_mongodb主从复制原理Go语言中所有赋值操作都是值传递,如果结构中不含指针,则直接赋值就是深度拷贝;如果结构中含有指针(包括自定义指针,以及切片,map等使用了指针的内置类型),则数据源和拷贝之间对应指针会共同指向同一块内存,这时深度拷贝需要特别处理。目前,有三种方法,一是用gob序列化成字节序列再反序列化生成克隆对象;二是先转换成json字节序列,再解析字节序列生成克隆对象;三是针对具体情况,定制化拷贝。前两种方法虽……

    2022年10月2日
  • MessageDigest的功能及用法(加密解密)

    MessageDigest的功能及用法(加密解密)MessageDigest的功能及用法MessageDigest类为应用程序提供信息摘要算法的功能,如MD5或SHA算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度

    2022年7月1日
  • html5网页设计案例课堂_优秀PPT案例

    html5网页设计案例课堂_优秀PPT案例12个优秀的HTML5网站设计案例欣赏欣赏地址:12个优秀的HTML5网站设计案例欣赏

    2022年10月22日
  • excel怎么赋值0和1_excel单元格默认值

    excel怎么赋值0和1_excel单元格默认值getCell 获取列 需要用 createCell获取即可。导出报表时,明明是有数据的可就是报空指针异常。排查后发下报表表格没内容时不能用。

    2022年8月20日
  • 【SpringBoot】19、SpringBoot中实现启动任务

    【SpringBoot】19、SpringBoot中实现启动任务我们在项目中会用到项目启动任务,即项目在启动的时候需要做的一些事,例如:数据初始化、获取第三方数据等等,那么如何在SpringBoot中实现启动任务,一起来看看吧SpringBoot中提供了两种项目启动方案,CommandLineRunner和ApplicationRunner一、CommandLineRunner使用CommandLineRunner,需要自定义一个类区实现CommandLineRunner接口,例如:importorg.springframework.boot.

    2022年9月26日
  • datagroup激活码[最新免费获取]

    (datagroup激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日

发表回复

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

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