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

标签 java android android-view onclicklistener

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

最佳答案

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

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

还有一点:参数的类型是 View 而不是 Button,因为不仅 Buttons 对 OnClick 使用react,而且对 OnClick 使用react的 UI 对象的常见类型是 View。

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

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

更新

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

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

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

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

    });

您还可以拥有一个实现View.OnClickListener 接口(interface)的类的实例,甚至“Activity”本身也可以做到这一点,然后将其注册为监听器。

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

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

第一个很好,因为您可以直观地设置它,但考虑到它全部在 XML 文件中,并且您可以为一个 Activity 设置多个布局,在更大的项目中控制它可能会非常困惑。

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

关于java - 为什么我们必须在 onClick 方法中添加 'View' 作为参数以及它的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37682776/

相关文章:

java - 当我单击 JButton 时,JFrame 组件如何消失?

java - org.junit.ComparisonFailure 具有相同的结果

android - 为什么我的 Android 背景颜色不可见?

android - android中的简单动画冲突

java - Java Servlet关联数组请求参数解析

java - 将 json 日期解析为特定日期格式

android - 如何动态更改 ListView 项的 textColor?

android - 捏放大android相机

android - 在我的 android 应用程序中使用 native Activity 而不是 fbdialog/webview 登录 facebook

android - 没有导航和状态栏的全屏