Android onClick in XML vs. OnClickListener

KG6*_*ZVP 78 xml performance android android-fragments

我意识到之前已经提出了类似措辞的问题,但这是不同的.我是开发Android应用程序的新手,我有三个关于android:onclick=""XML属性和setOnClickListener方法之间差异的问题.

  1. 两者有什么不同?在编译时或运行时或两者都找到两个实现之间的区别?

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

  3. Android中片段的使用与实现选择有何不同?

Jeb*_*han 117

OnClickListener与OnClick之间的区别:

  • OnClickListener是您需要实现的接口,可以在java代码中设置为视图.
  • OnClickListener是等待某人实际点击的内容,onclick确定当有人点击时会发生什么.
  • 最近android为名为android:onclick的视图添加了一个xml属性,可用于直接在视图的活动中处理点击,而无需实现任何接口.
  • 如果需要,您可以轻松地将一个侦听器实现与另一个实现交换.
  • OnClickListener使您能够将click事件的动作/行为与触发事件的View分开.虽然对于简单的情况,这对于复杂的事件处理来说并不是什么大问题,但这可能意味着更好的可读性和代码的可维护性
  • 由于OnClickListener是一个接口,因此实现它的类在确定处理事件所需的实例变量和方法时具有灵活性.同样,在简单的情况下,这不是什么大问题,但对于复杂的情况,我们不希望将与事件处理相关的变量/方法与触发事件的View代码混淆.
  • XML Layout中的onClick with function binding是onClick与它将调用的函数之间的绑定.该函数必须有一个参数(View)才能使onClick正常运行.

两者的功能相同,只需通过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
}
Run Code Online (Sandbox Code Playgroud)

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 -->
Run Code Online (Sandbox Code Playgroud)

性能:

两者的表现都相同.在编译时,Xml被预解析为二进制代码.所以在Xml中没有头脑.

局限性:

android:onClick适用于API级别4以上,所以如果您的目标是<1.6,那么您就无法使用它.


Liv*_*vio 14

我很震惊没有人谈到这个,但要小心,虽然android:onClickXML似乎是处理点击的一种方便的方法,setOnClickListener实现除了添加之外还做了一些额外的事情onClickListener.实际上,它将view属性设置clickable为true.

虽然在大多数Android实现中它可能不是问题,但根据电话构造函数,按钮总是默认为clickable = true但某些手机型号上的其他构造函数可能在非Button视图上具有默认的clickable = false.

因此设置XML是不够的,你必须一直认为添加android:clickable="true"非按钮,如果你有一个设备,其默认值是clickable = true,你甚至忘记了一次放置这个XML属性,你将不会注意到这个问题在运行时会在客户手中获得市场反馈!

此外,我们永远无法确定proguard将如何对XML属性和类方法进行模糊处理和重命名,因此不能100%安全地确保它们有一天不会出现错误.

因此,如果您从未想过遇到麻烦而从未想过它,那么最好使用setOnClickListener像ButterKnife 这样的库或带有注释的库@OnClick(R.id.button)

  • 您是否有任何经验(或在某处看到)由于使用“android:onClick”时的混淆而导致错误发生? (2认同)

mar*_*son 11

只是:

如果你有android:onClick = "someMethod" xml,它会public void someMethod在你的Activity类中查找.从您的ActivityOnClickListener调用,它与某些特定的链接.例如,在下面的代码中说明按下时必须执行的操作.ViewsomeButton.setOnClickListenersomeButton

希望能帮助到你 :)