为什么我们必须在 onClick 方法中添加 'View' 作为参数以及它的作用是什么?

Why do we have to add 'View' as parameter in onClick method and what it does?

我正在 Android Studio 中的按钮上设置一个事件侦听器,用于更改 TextView 中的文本,此时我们定义了 OnClick 方法。在其参数列表中,它要求 View 对象。任何人都可以解释它的作用吗?我不明白 View class 的对象将在哪里使用。

它可以让您重用 OnClick 方法等事件处理程序,在您的情况下,View 参数是触发该方法的 Button 实例 - 多个 Button 可以具有相同的 OnClick 处理程序,您可以在方法内部检查触发了哪个按钮(如果有多个按钮)并做出相应反应。

实际上,event-driven 编程非常典型,不仅在 Android 上,而且在所有当代 UI 编程上都是如此 - iOS、Windows、OS/X,等等

还有一点:参数的类型是 View 而不是 Button,因为不仅 Buttons 对 OnClick 做出反应,而且 UI objects 对 OnClick 做出反应的常见类型是 View .

现在您不仅可以以不同的方式处理事件,还可以直接访问事件的来源,以便您可以对其进行处理 - 在 Button 示例中,您可以更改其标题并且您肯定知道您正在更改触发事件的 UI object 的标题。

因此以这种方式执行 event-driven API 很有意义。

更新

注册事件处理程序(或 Android-world 中的 ClickListener)的方法之一是直接在布局中将方法名称分配给 onClick 属性 - 当然前提是该方法具有正确的签名,即期望一个 View 类型的参数并且具有 void return 类型 - 您可以在另一个答案中看到一个示例。

另一种是像这样分配一个匿名内部class作为Listener:

findViewById(R.id.someButton).setOnClickListener(
    new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        doSomething();
      }

    });

你也可以有一个 class 实现 View.OnClickListener 接口的实例,甚至 `Activity' 本身也可以做到,然后将其注册为监听器。

事实上,它们的工作原理都是一样的——在按钮实例中注册了一个 class 实现 View.OnClickListener 接口的实例,该按钮(或与此相关的视图)识别一个在其边界内单击并调用将自身 (this) 传递给侦听器的侦听器。

我个人认为第三种方式是最糟糕的 - 你只能在 class 中使用一种名称方法,但布局中有很多按钮,因此所有按钮都需要使用条件处理代码。

第一个很好,因为您可以直观地设置它,但考虑到它都在 XML 文件中,并且您可以为一个 activity 设置多个布局,因此保留起来可能会很麻烦它在一个更大的项目中得到控制。

因此,我最喜欢的是第二个 - 它允许您将所有逻辑保留在代码中的一个位置,例如,如果您在 [=53= 的 onCreate 方法中注册所有处理程序].

使用view参数查找调用者,见代码:

public void buttonOnClick(View view) {
    switch (view.getId()) {
      case R.id.button1:
        doSomething1();
        break;
      case R.id.button2:
        doSomething2();
        break;
      }
}

因此可以对多个对象使用相同的方法:

android:onClick="buttonOnClick"