我意识到以前有人问过类似措词的问题,但这是不同的。我在开发android应用程序时还很陌生,关于android:onclick=""
XML属性和setOnClickListener
方法之间的区别,我有三个问题。
两者之间有什么区别?在编译时或运行时或在两者时发现两种实现之间的区别吗?
哪些用例有利于哪种实现?
Android中使用片段对实现选择有何不同?
我意识到以前有人问过类似措词的问题,但这是不同的。我在开发android应用程序时还很陌生,关于android:onclick=""
XML属性和setOnClickListener
方法之间的区别,我有三个问题。
两者之间有什么区别?在编译时或运行时或在两者时发现两种实现之间的区别吗?
哪些用例有利于哪种实现?
Android中使用片段对实现选择有何不同?
android:onclick
方便的时候,但是我知道有时候它会引起问题,我也不记得了:)
Answers:
OnClickListener与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
}
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 -->
性能:
两者的性能相同。编译时将Xml预解析为二进制代码。因此Xml中没有开销。
局限性:
android:onClick适用于API级别4以上,因此,如果您的目标是<1.6,则无法使用它。
令我震惊的是,没有人谈论这件事,但要小心,尽管android:onClick
XML似乎是处理单击的一种便捷方法,但setOnClickListener
实现除了添加之外还做了其他事情onClickListener
。确实,它使view属性clickable
为true。
尽管在大多数Android实现中这可能不是问题,但根据电话构造函数的说法,button始终默认为clickable = true,但某些电话模型上的其他构造函数在非Button视图上可能具有默认的clickable = false。
因此,仅设置XML是不够的,您必须一直考虑添加android:clickable="true"
非按钮,并且如果您的设备的默认设置为clickable = true,并且甚至忘记一次放置此XML属性,您都不会注意到在运行时出现问题,但是当它掌握在客户手中时,它将获得市场反馈!
此外,我们永远无法确定proguard将如何混淆和重命名XML属性和类方法,因此不能百分百保证它们一天都不会出现错误。
因此,如果您从不希望遇到麻烦而从未考虑过,最好使用setOnClickListener
带有注释的ButterKnife之类的库@OnClick(R.id.button)
android:onClick
?
如前所述:它们都是增加对事件(在本例中为“单击”事件)的响应的方式。
我会在逻辑和表示之间进行分离,就像在HTML / JavaScript世界中所做的那样:保留XML用于表示,并通过代码添加事件侦听器。
始终使用android:onClick属性会更方便,除非您有充分的理由不这样做,例如,例如在运行时实例化Button或需要在Fragment子类中声明单击行为。
您可能要以编程方式设置的原因有两个OnClickListener
。第一个是您是否想在应用程序运行时更改按钮的行为。您可以将按钮完全指向另一种方法,也可以通过将按钮设置为OnClickListener
不执行任何操作来禁用按钮。
使用onClick
属性定义侦听器时,视图仅在其主机活动中查找具有该名称的方法。通过编程设置an,OnClickListener
可以从主机活动以外的其他位置控制按钮的行为。当我们使用时Fragments
,这将是非常相关的,它们基本上是微型活动,使您可以构建具有自己生命周期的可重用视图集合,然后将其组合成活动。由于片段OnClickListeners
不是活动,因此始终需要使用片段来控制其按钮,并且不会在onClick中定义的侦听器中进行搜索。
我认为它们之间的主要区别是:
OnClick:当您用手指单击按钮时。
OnClickListner:用各种代码实现可能是一个更广泛的选择。
例如,当您键入URL“ ymail.com”时,雅虎会从浏览器中找到您的用户名和密码,然后启用点击状态按钮以打开您的邮件。此操作仅应在onClickListener中实现。
这是我的主意!
onclick
因为需要确保每个类都实现该方法。这是假设您多次使用布局。但是,如果要有一个Java接口来确保该方法已在实现该方法的所有类中使用,则不必担心。