获取 Android 页面所有控件的点击事件
本产品不提供远程依赖,仅提供思路与实现方式
github地址
分三种方法实现
PageViewLifecycleHelper.with(this).addPageViewListener(PageViewType.frameLayout,basePageViewListener) 复制代码
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| PageViewType.frameLayout | int | 具体实现方式 |
| basePageViewListener | BasePageViewListener | 点击回调 |
以下三种方式的回调与之保持一致,所以仅说明一次。
onClick(view) 普通View的点击事件
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| view | View | 当前点击的控件布局 |
onItemClick(parent,view,position,id) AdapterView的点击事件
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| parent | AdapterView | 当前的AdapterView |
| view | View | 当前的AdapterView的item的view的布局 |
| position | int | 当前item在AdapterView中适配器里的位置 |
| id | long | 当前item在AdapterView中的行数 |
onItemSelected(parent,view,position,id) AdapterView的选择事件
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| parent | AdapterView | 当前的AdapterView |
| view | View | 当前的AdapterView的item的view的布局 |
| position | int | 当前item在AdapterView中适配器里的位置 |
| id | long | 当前item在AdapterView中的行数 |
onNothingSelected(parent,view,position,id) AdapterView的未选择事件
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| parent | AdapterView | 当前的AdapterView |
onItemClick(RecyclerView recyclerView, View view, int position) RecyclerView的点击事件
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| recyclerView | RecyclerView | 当前的RecyclerView |
| view | View | 当前的RecyclerView的item的view的布局 |
| position | int | 当前item在RecyclerView中适配器里的位置 |
PageViewLifecycleHelper.with(this).addPageViewListener(PageViewType.hookView,basePageViewListener) 复制代码
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| PageViewType.frameLayout | int | 具体实现方式 |
| basePageViewListener | BasePageViewListener | 点击回调 |
PageViewAspectjHelper.with().setBasePageViewListener(basePageViewListener) 复制代码
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| basePageViewListener | BasePageViewListener | 点击回调 |
现阶段有开源的框架,可以简单的在Android中使用,如 gradle_plugin_android_aspectjx 。 如果想自己集成,则步骤如下:
classpath 'org.aspectj:aspectjtools:1.9.4' import com.android.build.gradle.LibraryPlugin
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main
android.libraryVariants.all {
variant -> LibraryPlugin plugin = project.plugins.getPlugin(LibraryPlugin)
JavaCompile javaCompile = variant.javaCompile
javaCompile.doLast {
String[] args = ["-showWeaveInfo",
"-1.8",
"-inpath", javaCompile.destinationDir.toString(),
"-aspectpath", javaCompile.classpath.asPath,
"-d", javaCompile.destinationDir.toString(),
"-classpath", javaCompile.classpath.asPath,
"-bootclasspath", plugin.project.android.bootClasspath.join(
File.pathSeparator)]
MessageHandler handler = new MessageHandler(true)
new Main().run(args, handler)
def log = project.logger
for (IMessage message : handler.getMessages(null, true)) {
switch (message.getKind()) {
case IMessage.ABORT:
case IMessage.ERROR:
case IMessage.FAIL:
log.error message.message, message.thrown
break
case IMessage.WARNING:
case IMessage.INFO:
log.info message.message, message.thrown
break
case IMessage.DEBUG:
log.debug message.message, message.thrown
break
}
}
}
}
dependencies {
api 'org.aspectj:aspectjrt:1.9.4'
}
复制代码
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main
final def log = project.logger
final def variants = project.android.applicationVariants
variants.all { variant ->
if (!variant.buildType.isDebuggable()) {
log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
return
}
JavaCompile javaCompile = variant.javaCompile
javaCompile.doLast {
String[] args = ["-showWeaveInfo",
"-1.8",
"-inpath", javaCompile.destinationDir.toString(),
"-aspectpath", javaCompile.classpath.asPath,
"-d", javaCompile.destinationDir.toString(),
"-classpath", javaCompile.classpath.asPath,
"-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
log.debug "ajc args: " + Arrays.toString(args)
MessageHandler handler = new MessageHandler(true)
new Main().run(args, handler)
for (IMessage message : handler.getMessages(null, true)) {
switch (message.getKind()) {
case IMessage.ABORT:
case IMessage.ERROR:
case IMessage.FAIL:
log.error message.message, message.thrown
break
case IMessage.WARNING:
log.warn message.message, message.thrown
break
case IMessage.INFO:
log.info message.message, message.thrown
break
case IMessage.DEBUG:
log.debug message.message, message.thrown
break
}
}
}
}
复制代码
现阶段只获取了普通View,AdapterView,RecycleView这几个,当然同样的思路可以放在更多的View上,如:ExpandableListView等等。