为什么我们要添加'查看'作为onClick方法中的参数及其作用?

时间:2016-06-07 14:56:17

标签: java android android-view onclicklistener

我在Android Studio的按钮上设置了一个事件监听器来更改TextView内的文本,并且我们定义了OnClick方法。在其参数列表中,它要求View对象。任何人都可以解释它的作用吗?我无法理解View类的对象将在何处被使用。

2 个答案:

答案 0 :(得分:3)

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

实际上,不仅在Android上而且在所有当代UI编程中都是非常典型的事件驱动编程 - iOS,Windows,OS / X等。

还有一点:参数的类型是View而不是Button,因为不仅Buttons对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方法中注册所有处理程序。

答案 1 :(得分:3)

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

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

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

android:onClick="buttonOnClick"