Android DEV : setOnClickListener() vs. android:onClick

晚上查看一段资源xml文件时, 发现View竟然有个'android:onClick'属性...这太'震惊'了...

刚开始敲Android时, 就想过这个问题 -- android把资源文件用的如此灵活, 为啥View控件不能在资源文件中直接定义各类事件回调函数呢? 后来敲多了, 发现如果直接在资源文件中定义事件处理属性, 这会限制资源文件的使用, 像是同一份资源文件如果被两个不同的Activity使用, 那就必须各自写一个事件回调处理函数, 如果没有, 一旦事件被触发, 那就是异常啊; 另外, 如果资源文件被一个Fragment使用, 且在Fragment实现了事件处理函数, 那当Fragment加入到Activity后, 怕系统就找不到这个函数了. 因此, 觉得没有'android:onClick'这样的属性该是正常的, 后面也就没再想过这个了, 每次都很老实的使用View.setOnClickListener()了...

但, 现在这个属性竟然真是存在, 而且一直都在, 这太让我'崩溃'了...那感觉就像走在大街上, 突然看到有人在遛 --- 恐龙一样...

于是, 赶紧写了代码测试了下~

    <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="onButtonClick"        android:text="Button" />
public void onButtonClick(View view) {Log.d(Tag, "onButtonClick()");}

果然好用...但突然想到, 如果这个跟View.setOnClickListener()共存时, 调用过程该是如何呢?

Button btn = (Button) this.findViewById(R.id.button1);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Log.d(Tag, "onClickListener - onClick()");}});

测试结果是,OnClilckListener()中的onClick()会被调用, 而android:onClick定义的onButtonClick()完全被忽略了.

就如前面提到的, 这种属性设置的方式有些缺陷, 还是使用setOnClickListener()比较可控靠谱, 当然如果在布局文件使用比较固定的情况下, 这种属性定义方式确实可以少敲很多代码.

基于测试结果, 突然'抖机灵'地想到一段代码来 -- 如果在onButtonClick()中调用setOnClickListener()会怎样呢?

public void onButtonClick(View view) {Log.d(Tag, "onButtonClick()");Button btn = (Button) this.findViewById(R.id.button1);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Log.d(Tag, "onClickListener - onClick()");}});}


这样第一次点击时, 执行onButtonCllick(), 并将View的点击事件处理通过setOnClickListener()传到OnClickListener()中, 当再次被点击时, 就会执行onClick()了. 这就可以实现一种需求 -- 点一次没事, 再点就崩溃...根本不用加什么判断变量和语句了, 嘿嘿, 多'机智'啊...

<---- 拖延症也会并发的分割线 ---->

近段时间, 各种借口导致各种拖延症并发, 使得SnakeGo敲的甚是缓慢..不表了...

更多相关文章

  1. Android中RelativeLayout各个属性
  2. Android Touch事件传递机制引发的血案
  3. android layout属性简介
  4. 【Android UI】Android Layout XML属性

随机推荐

  1. Android(安卓)开发技术周报 Issue#292
  2. Android(安卓)中的dm-verity
  3. Android网络相关---上网流程
  4. Android音频系统之USB设备通路(Android(安
  5. EventBus3.0使用详解
  6. Android电源管理
  7. 用Android模拟器体验angry birds
  8. 64位 ubuntu android SDK 无法新建AVD,adb
  9. iOS从业者的Android初体验
  10. Android(安卓)- 主要的UI元素。