我正在尝试在我的Android应用中实现按钮点击处理。
在包含我的按钮的XML布局文件中,我将以下行添加到我的Button
XML元素中:
android:onClick="handleClick"
我还在使用此布局的Activity
中定义了一个带有以下签名的方法:
public void handleClick() { /* ... */ }
然而,当我使用此代码运行我的应用程序时,它崩溃了。我能够通过将我的方法签名更新为:
来修复此崩溃public void handleClick(View v) { /* ... */ }
但我不明白为什么我需要包含此View
参数?
答案 0 :(得分:3)
这是因为您可能希望将handleClick
方法用于XML中的2个或更多按钮。
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="handleClick"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="handleClick"/>
在这种情况下,可能不清楚哪个按钮触发回调。 View v
可以帮助您识别出这种情况。
public void handleClick(View v) {
if (v.getId() == R.id.button1) {
} else if(v.getId() == R.id.button2) {
}
}
答案 1 :(得分:2)
提供的View
参数表示收到点击事件的View
。如果您为多个handleClick
重复使用View
方法,这可能很有用(在这种情况下,您可以检查传递给方法的id
的{{1}}以确定哪个点击了View
,如Enzokie's answer所示。
即使您未在点击逻辑中使用此参数,也必须在定义方法时包含此View
参数。这是因为reflection用于定位与您在XML中提供的名称对应的方法,并且方法名称,参数计数和参数类型都是Java中uniquely define a method所需的。查看this section of the View
source code以确切了解此反思查找的工作原理!
答案 2 :(得分:1)
查看v 是xml文件的对象,该文件在 onCreate 方法中引用。 要从xml引用任何组件,您必须使用 v 来获取组件的ID。
<强>条件强>
如果要在类文件中使用 onClick ,则必须为xml中的组件指定id。