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

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

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


当前回答

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

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

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

其他回答

支持Ruivo的答案,是的,你必须声明方法为“公共”,才能在Android的XML onclick中使用-我正在开发一个应用程序,从API级别8 (minSdk…)到16 (targetSdk…)

我宣称我的方法是私人的,它造成了错误,只是宣称它是公共工程。

不,通过代码是不可能的。当你定义Android:onClick="someMethod"属性时,Android只是实现了OnClickListener。

这两个代码段是相等的,只是以两种不同的方式实现。

代码实现

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
}

上面是OnClickListener的代码实现。这是XML实现。

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 -->

在后台,Android只做Java代码,在点击事件时调用你的方法。

注意,使用上面的XML, Android将只在当前Activity中寻找onClick方法myFancyMethod()。如果你正在使用片段,记住这一点很重要,因为即使你使用片段添加上面的XML, Android也不会在用于添加XML的片段的.java文件中查找onClick方法。

我注意到另一件重要的事情。你提到你不喜欢匿名方法。你的意思是说你不喜欢匿名课程。

我在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"/>

然后以片段的形式编写这段代码……

public void register(View view) {
}

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

public void myFancyMethod(View v) {}

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

android:onClick="myFancyMethod"/>

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