浅析

performClick 官方注释

Call this view’s OnClickListener, if it is defined. Performs all normal actions associated with clicking: reporting accessibility event, playing a sound, etc.
调用此视图的 OnClickListener(如果已定义)。 执行与点击相关的所有正常操作:报告无障碍事件、播放声音等。

很明显的意思,通过performClick调用了OnClickListener

看一下performClick的源码实现:

public boolean performClick() {
        // We still need to call this method to handle the cases where performClick() was called
        // externally, instead of through performClickInternal()
        notifyAutofillManagerOnClick();

        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;
    }

关注一个很重要的点,首先判断mOnClickListener是否为null。如果不为null,则调用li.mOnClickListener.onClick(this),即会调用到外部写的点击事件。

如何使用

模拟点击事件

这个用法网上大部分都有了,这里也做一下简单的描述:
通过上面的源码分析,大家可以看到通过performClick可以调用到点击事件,又因为performClick方法的访问修饰权限是公开的。所以外部可以直接调用performClick用于模拟点击事件。
举个🌰

val tv = findViewById<TextView>(R.id.tv_main)
tv.setOnClickListener { 
    Toast.makeText(this,"mock click",Toast.LENGTH_SHORT).show()
}
tv.performClick()

这样执行程序,就会提示mock click

配合自定义View

performClick还有一个重要的使用方式,当自定义View的时候,如果需要有一个默认的点击事件时,你应该如何处理呢?
可以使用performClick来进行优雅的实现这一需求。
如下所示,举个🌰:

override fun performClick(): Boolean {
   if (super.performClick()) return true

	//TODO 	

   return true
}

这么写的话,如果外部设置了OnClickListener则使用外部的点击事件,performClickl里面的默认操作就无效了。非常适合自定义View的时候使用,灵活度非常高!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐