Codejie's C++ Space

Using C++

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() {

			@Override
			public 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() {

			@Override
			public void onClick(View v) {
				Log.d(Tag, "onClickListener - onClick()");
			}
			
		});		
	}


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

 

 

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

 

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

posted on 2014-06-06 21:40 codejie 阅读(2092) 评论(0)  编辑 收藏 引用 所属分类: G7


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

Using C++

导航

统计

留言簿(73)

随笔分类(513)

积分与排名

最新评论

阅读排行榜

评论排行榜