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

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

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


当前回答

检查一下是否忘记将方法设置为public!

其他回答

在Java 8中,您可以使用Method Reference来实现您想要的功能。

假设这是按钮的onClick事件处理程序。

private void onMyButtonClicked(View v) {
    if (v.getId() == R.id.myButton) {
        // Do something when myButton was clicked
    }
}

然后,像这样在setOnClickListener()调用中传递onMyButtonClicked实例方法引用。

Button myButton = (Button) findViewById(R.id.myButton);
myButton.setOnClickListener(this::onMyButtonClicked);

这将允许您避免自己显式地定义匿名类。然而,我必须强调,Java 8的Method Reference实际上只是一个语法糖。它实际上为您创建了一个匿名类的实例(就像lambda表达式所做的那样),因此当您要取消事件处理程序的注册时,会应用lambda表达式风格的事件处理程序。这篇文章解释得很好。

PS.对于那些好奇我如何在Android中真正使用Java 8语言功能的人,这是retrolambda库的礼貌。

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

public void myFancyMethod(View v) {}

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

android:onClick="myFancyMethod"/>

检查一下是否忘记将方法设置为public!

假设,你想添加这样的点击事件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) {
}

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

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