从我所读到的,你可以用两种方式为按钮分配onClick处理程序。

使用android:onClick XML属性,你只是使用一个公共方法的名称与signaturevoid名称(View v)或通过使用setOnClickListener方法,你传递一个实现OnClickListener接口的对象。后者通常需要一个匿名类,我个人不喜欢(个人口味)或定义一个实现OnClickListener的内部类。

通过使用XML属性,你只需要定义一个方法而不是一个类 想知道同样的事情是否可以通过代码而不是在XML布局中完成。


当前回答

android:onClick是API级别4以上,所以如果你的目标< 1.6,那么你不能使用它。

其他回答

当我看到顶部的答案时,它让我意识到我的问题不是把参数(View v)放在花哨的方法上:

public void myFancyMethod(View v) {}

当试图从xml中访问它时,应该使用

android:onClick="myFancyMethod"/>

小心,虽然android:onClick XML似乎是一个方便的方式来处理点击,setOnClickListener实现做一些额外的添加onClickListener。实际上,它把视图属性clickable设为true。

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

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

此外,我们永远无法确定proguard将如何混淆和重命名XML属性和类方法,所以不是100%安全,它们永远不会有任何错误。

因此,如果你不想有麻烦,也不想想它,最好使用setOnClickListener或ButterKnife这样的库,annotation @OnClick(R.id.button)

最好的方法是使用以下代码:

 Button button = (Button)findViewById(R.id.btn_register);
 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //do your fancy method
            }
        });

通过使用XML属性,您只需要定义一个方法而不是 一个类,所以我想知道如果同样可以通过代码而不是在 XML布局。

是的,你可以让你的片段或活动实现视图。OnClickListener

当你在代码中初始化你的新视图对象时,你可以简单地做mView.setOnClickListener(this);

这将自动设置代码中的所有视图对象使用onClick(view v)方法,您的片段或活动等。

为了区分哪个视图调用了onClick方法,你可以在v.getId()方法上使用switch语句。

这个答案不同于“不,通过代码是不可能的”

这里有很好的答案,但我想补充一句:

在XML中的android:onclick中,android在后台使用java反射来处理这个问题。

正如这里所解释的,反射总是会降低性能。(特别是Dalvik VM)。注册clicklistener是一种更好的方法。