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

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

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


当前回答

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

其他回答

注意,如果您想使用onClick XML特性,相应的方法应该有一个参数,其类型应该与XML对象匹配。

例如,一个按钮将通过它的名称字符串链接到你的方法:android:onClick="MyFancyMethod",但方法声明应该显示: ...MyFancyMethod(View v){…

如果您试图将此功能添加到菜单项,它将在XML文件中具有完全相同的语法,但您的方法将被声明为:…MyFancyMethod(MenuItem mi){…

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

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

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

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

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

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

假设,你想添加这样的点击事件main.xml

<Button
    android:id="@+id/btn_register"
    android:layout_margin="1dp"
    android:layout_marginLeft="3dp"
    android:layout_marginTop="10dp"
    android:layout_weight="2"
    android:onClick="register"
    android:text="Register"
    android:textColor="#000000"/>

在java文件中,你必须写一个像这样的方法。

public void register(View view) {
}

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

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

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

为了让你的生活更简单,并避免setOnClicklistener()中的匿名类,实现一个视图。OnClicklistener接口如下:

公共类YourClass扩展了CommonActivity,实现了View。OnClickListener,……

这避免了:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        yourMethod(v);
    }
});

并直接指向:

@Override
public void onClick(View v) {
  switch (v.getId()) {
    case R.id.your_view:
      yourMethod();
      break;
  }
}