首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于XML的Android onClick与OnClickListener

基于XML的Android onClick与OnClickListener
EN

Stack Overflow用户
提问于 2014-01-24 05:45:00
回答 8查看 74.7K关注 0票数 91

我知道以前也有人问过类似的问题,但这次是不同的。我是一个开发安卓应用的新手,关于android:onclick="" XML属性和setOnClickListener方法之间的区别,我有三个问题。

  1. 这两者有什么不同?两个实现之间的差异是在编译时还是运行时,还是两者都有?
  2. 在实现选择中使用片段时,哪些用例有利于implementation?
  3. What的不同?
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-01-24 15:12:49

OnClickListener与OnClick之间的差异:

  • OnClickListener是您需要实现的接口,可以在java代码中设置为视图。onclick是等待有人真正点击的东西,
  • OnClickListener决定了当有人点击时会发生什么。
  • 最近在视图中添加了一个名为android:onclick的xml属性,可以用来直接在视图的活动中处理点击,而不需要实现任何接口。
  • 如果需要,你可以很容易地将一个监听器实现与另一个实现交换。
  • An OnClickListener使你能够将点击事件的操作/行为与触发事件的视图分开。虽然对于简单的情况,这不是什么大问题,但对于复杂的事件处理,这可能意味着代码
  • 的可读性和可维护性更好,因为OnClickListener是一个接口,实现它的类在确定处理事件所需的实例变量和方法方面具有灵活性。同样,在简单的情况下,这不是什么大问题,但对于复杂的情况,我们不希望将与事件处理相关的变量/方法与触发事件的视图的代码混为一谈。
  • onClick

function binding in XML Layout是onClick和它将调用的函数之间的绑定。该函数必须有一个参数(视图),onClick才能运行。

两者的功能相同,只是一个是通过java代码设置的,另一个是通过xml代码设置的。

setOnClickListener代码实现:

代码语言:javascript
复制
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实现:

代码语言:javascript
复制
<?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在编译时被预解析成二进制代码。所以在Xml中没有额外开销。

限制:

android:onClick是针对API level 4以上的,所以如果你的目标是小于1.6,那么你就不能使用它。

票数 127
EN

Stack Overflow用户

发布于 2017-05-25 23:21:13

我很惊讶没有人谈论这一点,但是要小心,尽管android:onClick XML似乎是处理单击的一种方便方法,但setOnClickListener实现除了添加onClickListener之外,还做了一些其他的事情。实际上,它将视图属性clickable设置为true。

虽然这在大多数Android实现上可能不是问题,但根据phone构造函数,button总是默认为clickable = true,但在某些phone模型上的其他构造函数在非Button视图上可能有默认的clickable = false。

因此,设置XML是不够的,您必须一直考虑在非按钮上添加clickable,如果您的设备的默认值为android:clickable="true" = true,并且您甚至一次都忘记了放置此XML属性,那么您将不会在运行时注意到问题,但当它到达客户手中时,您将获得市场上的反馈!

此外,我们永远不能确定proguard将如何混淆和重命名XML属性和类方法,因此不是100%安全,所以它们总有一天不会有bug。

因此,如果您不想遇到麻烦,也不想去考虑它,最好将setOnClickListener或像ButterKnife这样的库与批注@OnClick(R.id.button)一起使用

票数 23
EN

Stack Overflow用户

发布于 2014-01-24 15:19:52

简单地说:

如果在xml中有android:onClick = "someMethod" ,它将在您的Activity类中查找public void someMethodOnClickListener在您的Activity中称为right ,它链接到某个特定的View。例如,在下面的代码中,someButton.setOnClickListener说明了当按下someButton时必须执行的操作。

希望它能有所帮助:)

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21319996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档