据我所知,您可以通过两种方式将onClick处理程序分配给一个按钮.

使用android:onClickXML属性(其中您仅将公共方法的名称与signaturevoid name(View v)一起使用)或使用setOnClickListener方法(其中您传递实现OnClickListener接口的对象).后者通常需要一个我个人不喜欢的匿名类(个人喜好),或者定义一个实现OnClickListener的内部类.

通过使用XML属性,您只需要定义一个方法,而不是一个类

推荐答案

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

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

Code Implementation

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 Implementation

<?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将只在当前活动中查找onClick方法myFancyMethod().如果您使用的是片段,记住这一点很重要,因为即使您使用片段添加上面的XML,Android也不会在用于添加XML的片段的.java文件中查找onClick方法.

我注意到的另一件重要的事.你说过你不喜欢匿名methods.你的意思是说你不喜欢匿名classes.

Android相关问答推荐

带有kSP而不是kapt的Hilt

如何在停止和销毁时更改函数中Firebase实时数据库的子项的值我试过了,但这不起作用.请使用Kotlin

穿戴与iPhone连接的安卓操作系统

如何在初始合成期间在可组合函数中调用/获取远程API中的数据[防止无限重组]

Android从已连接的设备获得GATT

如何共享没有';t是否存在?(仅信息)在Android?

在c中更新MVVMCross中TextView的Alpha#

减少Compose中可滚动选项卡之间的间距

使用 settings.gradle 文件将 Firebase 依赖项添加到 Android 项目

从 HiltViewModel @Injection 访问 Application()

setContentView() 方法的签名

延时kotlin中时分秒的使用方法

修复错误 Invariant Violation: requireNativeComponent: "RNSScreenStackHeaderConfig" was not found in the UIManager

AirDroid Business 如何能够从屏幕截图中排除覆盖?

Jetpack Compose 动画的行为是什么?

为卡片的上半部分添加一个边框,用圆角半径组合

Jetpack Compose Material3 禁用 ListItem

如何在包含 Jetpack Compose 内容的布局中使用权重

如何在 TextInputEdit 中调整可绘制对象的大小

在delphi中将Jnet_uri转换为Tbitmap