【问题标题】:Why do we have to add 'View' as parameter in onClick method and what it does?为什么我们必须在 onClick 方法中添加“视图”作为参数,它的作用是什么?
【发布时间】:2017-07-20 03:07:55
【问题描述】:

我在 Android Studio 中的按钮上设置了一个事件侦听器,用于更改 TextView 中的文本,到此为止,我们定义了 OnClick 方法。在其参数列表中,它要求View 对象。谁能解释它的作用?我不明白View 类的对象将在哪里使用。

【问题讨论】:

标签: java android android-view onclicklistener


【解决方案1】:

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

实际上,事件驱动编程非常典型,不仅适用于 Android,而且适用于所有当代 UI 编程 - iOS、Windows、OS/X 等。

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

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

所以以这种方式来做事件驱动的 API 是很有意义的。

更新

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

另一种是像这样分配一个匿名内部类作为监听器:

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

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

    });

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

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

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

第一个很好,因为您可以直观地设置它,但考虑到它都在 XML 文件中,并且您可以为一个活动有多个布局,在更大的项目中控制它可能会很混乱。

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

【讨论】:

  • 非常感谢我现在明白了:)
  • 但我有最后一个问题 - 因为 onClick 是我们用于按钮的一种方法,并且使用 View 作为参数,这意味着无论何时调用它,都会将一个对象传递给它(如果我'没有错)。我不明白它在哪里将对象(按钮类对象)作为参数传递给这个方法,你能解释一下吗?
  • 我不太清楚你的意思,我会试着解释一下我的猜想 - 每个View 自己处理它的点击事件并调用一个注册的侦听器方法(事件处理程序)传递this 给听众。因此,是 Button 本身调用了您的方法并使用 this 作为参数。
  • 我稍后会在答案中添加一个示例。
  • 我明白了你的意思,但我的问题不是这个意思:P - 我的意思是 onClick 方法中的参数“public void onClick(View v)”
【解决方案2】:

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

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

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

android:onClick="buttonOnClick"

【讨论】:

  • 非常感谢我现在明白了:)
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多