1.2 View绑定listener方式
随着Android相关技术的不断更新迭代,给View绑定listener的方式也是多种多样的。下面以Button为例来介绍日常开发中比较常见的几种绑定listener的方式。
·通过代码来设置listener
Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //do something } });
这种方式是目前开发中最常用的方式,也是我们全埋点方案需要重点解决和重点支持的方式。
·通过android:onClick属性绑定listener
先在布局文件中声明Button的android:onClick属性,如:
<android.support.v7.widget.AppCompatButton android:id="@+id/xmlOnClick" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="xmlOnClick" android:text="android:onClick 绑定OnClickListener"/>
我们设置android:onClick的属性值为“xmlOnClick”,此时的“xmlOnClick”代表点击处理逻辑对应的方法名。然后在对应的Activity文件中声明android:onClick属性指定的方法xmlOnClick:
public void xmlOnClick(View view) { //do something }
注意:该方法必须有且仅有一个View类型的参数。
这种方式在一些新的项目中不是很常见,在一些比较老的Android项目中可能会有这样大量的使用方式。
·通过注解绑定listener
目前有很多第三方的库都提供了类似的功能,下面以ButterKnife为例:
@OnClick({R2.id.butterknife}) public void butterKnifeButtonOnClick(View view) { //do something }
首先定义一个方法,并且该方法有且仅有一个View类型的参数,然后在该方法上使用ButterKnife的@OnClick注解声明,其中的参数代表控件的android:id。
这种方式,也是目前比较流行的其中一种使用方式。
关于ButterKnife更详细用法可以参考其官网:https://github.com/JakeWharton/butterknife。
·listener含有Lambda语法
Lambda是Java8开始支持的,如:
AppCompatButton button = findViewById(R.id.lamdbaButton); button.setOnClickListener(view ->Log.i("MainActivity", "Lambda OnClick"));
这种方式,也是目前比较流行的一种使用方式。
事实上,这根本就不算一种绑定listener的方式,只是绑定的listener中含有Lambda语法而已。之所以在这里要提到它,是因为这种方式会对我们选择全埋点方案时产生一定的影响,比如后面将要介绍的AspectJ全埋点方案目前就无法支持这种带有Lambda语法的点击事件。
关于Lambda的详细信息可以参考:https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html。
·通过DataBinding绑定listener
先在布局文件中声明android:onClick属性:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="handlers" type="cn.sensorsdata.autotrack.android.app.MainActivity" /> </data> <LinearLayoutxmlns:tools="http://schemas.android.com/tools" android:id="@+id/rootView" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <android.support.v7.widget.AppCompatButton android:id="@+id/dataBinding" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{handlers::dataBindingOnClick}" android:text="DataBinding 绑定 OnClickListener" android:textAllCaps="false" /> </LinearLayout> </layout>
android:onClick属性值为“@{handlers::dataBindingOnClick}”,意为该按钮的点击处理逻辑为handlers对象的dataBindingOnClick方法,其中handlers对象是MainActivity的实例.
然后在对应的Java文件中声明android:onClick属性指定的方法dataBindingOnClick:
public void dataBindingOnClick(View view) { //do something }
注意:该方法必须有且仅有一个View类型的参数。
这种方式,也是目前新流行的一种使用方式。
关于DataBinding更详细的用法请参考官网:https://developer.android.com/topic/libraries/data-binding/index.html。
由于全埋点重点解决的是控件的点击行为数据,所以了解控件都能设置哪些listener,以及设置或者绑定listener的不同方式,对于我们研究或者选择全埋点的方案,都会有非常大的帮助。