浅析
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() {
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
return true
}
这么写的话,如果外部设置了OnClickListener 则使用外部的点击事件,performClick l里面的默认操作就无效了。非常适合自定义View的时候使用,灵活度非常高!
|