Android onClick与OnClickListener
我意识到之前已经提出了一个类似措辞的问题,但这是不同的。 我在开发android应用程序方面很新颖,关于android:onclick=""
XML属性和setOnClickListener
方法之间的区别,我有三个问题。
-
两者有什么区别? 在编译时间或运行时间或两者之间find两个实现之间的差异?
-
哪些用例有利于哪些实现?
-
Android中的片段使用在实现select上有什么不同?
OnClickListener与OnClick的区别:
- OnClickListener是您需要实现的接口,可以设置为java代码中的视图。
- OnClickListener是等待某人实际点击的位置,onclick确定当有人点击时会发生什么。
- 最近,android向视图android:onclick添加了一个xml属性,可以直接在视图的活动中处理点击,而无需实现任何接口。
- 如果需要,可以轻松地将一个侦听器实现与另一个侦听器实现交换。
- OnClickListener使您能够从触发事件的视图中分离单击事件的操作/行为。 虽然对于简单的情况来说,对于复杂的事件处理来说这不是什么大事,这可能意味着更好的代码可读性和可维护性
- 由于OnClickListener是一个接口,实现它的类在确定实例variables和方法所需要的灵活性来处理事件。 再一次,在简单情况下这不是什么大问题,但对于复杂的情况,我们不希望将与事件处理相关的variables/方法与触发事件的View的代码混合在一起。
- 带有XML Layout中的函数绑定的onClick是onClick和它将调用的函数之间的绑定。 该函数必须有一个参数(视图)为了onClick函数。
两者的function相同,只是通过java代码设置,另一个通过xml代码设置。
setOnClickListener代码实现:
Button btn = (Button) findViewById(R.id.mybutton); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myFancyMethod(v); } }); // some more code public void myFancyMethod(View v) { // does something very interesting }
XML实现:
<?xml version="1.0" encoding="utf-8"?> <!-- layout elements --> <Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click me!" android:onClick="myFancyMethod" /> <!-- even more layout elements -->
性能:
两者在performance上都是一样的。 在编译时,Xml被预parsing为二进制代码。 所以在Xml中没有太多的东西。
局限性:
android:onClick适用于API级别4以上,所以如果您定位<1.6,则无法使用它。
只是:
如果在xml中有android:onClick = "someMethod"
,它将在Activity类中查找public void someMethod
。 OnClickListener
是从你的Activity中调用的,并且链接到某个特定的View
。 例如someButton.setOnClickListener
和下面的代码说someButton
被按下时要做什么。
希望它有助于:)
xml onClick不适用于在API级别19中dynamic膨胀的嵌套布局元素
我很震惊没有人谈论这个,但要小心,尽pipeandroid:onClick
XML似乎是一个方便的方式来处理点击, setOnClickListener
实现做一些额外的事情比添加setOnClickListener
。 的确,它把view属性clickable
为true。
虽然在大多数Android实现中可能不是问题,但根据电话构造函数,button始终默认为clickable = true,但某些电话型号上的其他构造函数在非Buttonbutton上可能具有默认clickable = false。
因此,设置XML是不够的,你必须一直认为在非button上添加android:clickable="true"
,如果你有一个默认设置为clickable = true的设备,并且你忘记了这个XML属性,在运行时你不会注意到这个问题,但是当它将在你的客户手中的时候,会在市场上得到反馈!
另外,我们永远无法确定proguard是如何混淆和重命名XML属性和类方法的,所以不是100%安全的,他们永远不会有bug。
所以,如果你不想有麻烦,也从来没有想过,最好使用setOnClickListener
或像ButterKnife这样的库来注释@OnClick(R.id.button)
如前所述:它们都是添加逻辑以响应事件的方式,在这种情况下是“点击”事件。
我将在逻辑和表示之间进行分离,就像我们在HTML / JavaScript世界中所做的那样:留下用于表示的XML并通过代码添加事件监听器。
如果你有几个button只使用一种方法,我build议用java做。 但是如果你有一个特定方法的button,onClick在XML会更好。
总是使用android:onClick属性会更方便,除非您有充分的理由不要(例如)在运行时实例化button或者需要在Fragment子类中声明点击行为。
我认为他们之间的主要区别是:
OnClick:当你用手指点击button。
OnClickListner:它可能是一个更广泛的select,在各种代码中实现。
例如,当您inputurl“ymail.com”时,yahoo会从浏览器中find您的用户名和密码,并启用点击状态button打开您的邮件。 这个动作只能在onClickListener中实现。
这是我的想法!
- 使用ACTION_IMAGE_CAPTURE拍摄的图像在某些较新的设备上始终返回1,表示ExifInterface.TAG_ORIENTATION
- 如何在Android中暂停/恢复线程?
- 我怎样才能改变Android上的选项菜单上的MenuItem?
- 如何以编程方式将活动的背景颜色设置为白色?
- javax.net.ssl.SSLException:读取错误:ssl = 0x9524b800:系统调用期间发生I / O错误,由对等方重置连接
- TextView中的链接
- 我们可以使用JDBC在Android中连接远程MySQL数据库吗?
- 如何从处理程序中删除所有callback?
- 如何在DatePickerDialog Android的今天date之前禁用date?