Android onClick与OnClickListener

我意识到之前已经提出了一个类似措辞的问题,但这是不同的。 我在开发android应用程序方面很新颖,关于android:onclick="" XML属性和setOnClickListener方法之间的区别,我有三个问题。

  1. 两者有什么区别? 在编译时间或运行时间或两者之间find两个实现之间的差异?

  2. 哪些用例有利于哪些实现?

  3. 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 someMethodOnClickListener从你的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中实现。

这是我的想法!