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

2024-02-21

我正在 Android Studio 中的按钮上设置事件监听器,用于更改按钮内的文本TextView到了这一点,我们定义了OnClick方法。在其参数列表中要求View目的。谁能解释一下它的作用吗?我无法理解对象在哪里View类将会习惯。


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

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

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

现在,您不仅可以以不同的方式处理事件,还可以直接访问事件的源,以便您可以处理它 - 在按钮的示例中,您可以更改其标题,并且您确信您正在更改触发该事件的 UI 对象的标题。

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

UPDATE

注册事件处理程序(或 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活动的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们必须在 onClick 方法中添加“View”作为参数以及它的作用是什么? 的相关文章

随机推荐

  • 如何从 C# Web 服务生成 WSDL 文件

    我创建了一个像这样的WebService WebService Namespace http ns WebServiceBinding ConformsTo WsiProfiles BasicProfile1 1 public class
  • 当应用程序处于后台时,活动在“最近”中不可见

    问题描述 在我的一个应用程序中 我看到了相当奇怪的行为 当我的应用程序在前台运行 最顶层的应用程序 时 我可以在系统的 最近 中看到其活动 但一旦我将其置于后台 相同的活动 即AccountsActivity 刚才列出的内容不再出现在 最近
  • 解组非根元素时的 JAXB 模式验证

    当您使用 JAXB 解组整个 XML 时 您可以设置 XML 模式以在解析期间启用验证 javax xml validation Schema schema jaxbUnmarshaller JAXBContext newInstance
  • 逐行读取并存储在结构体数组中

    我正在尝试从文本文件中逐行读取行并将其存储在数组中 txt 文件中有一些问题将询问玩家 下面是一些问题 1 N r kom potatisen till Europa A 1300 talet B 1500 talet C 900 tale
  • 禁用 Maven 内部版本号插件

    目前我们正在开发一个大型 Maven 项目 该项目有大约 100 个模块 其中一些还有子模块 一些模块使用 Maven Build Number 插件 该项目是在 Subversion 下托管的 最近我们的开发团队开始在本地使用 git 克
  • 使用 firebase 作业调度程序安排重复作业

    我试图每 10 分钟将 Android 设备的位置发布到服务器一次 我正在使用 firebase 作业调度程序来执行此操作 FirebaseJobDispatcher dispatcher new FirebaseJobDispatcher
  • 仅针对单个模式生成流畅的代码

    有没有办法让 Slick 的代码生成仅为单个模式生成代码 你说 公开 我有一些扩展可以创建大量的表 例如 postgis pg jobman 从而使 slick 生成的代码变得巨大 将此代码与适当的值和模式名称一起使用 object Cod
  • 如何在eclipse中缩进jsp页面

    刚开始使用 jsp 我的页面看起来很糟糕 请建议一种缩进的方法 thanks 首先确保您安装了 Web Tools 如果没有 请检查此链接 http download eclipse org webtools updates http do
  • 提升 Asio 单线程性能

    我正在实现需要维护大量 100K 或更多 长期连接的自定义服务器 服务器只是在套接字之间传递消息 并且不进行任何认真的数据处理 消息很小 但每秒都会接收 发送许多消息 减少延迟是目标之一 我意识到使用多核不会提高性能 因此我决定通过调用在单
  • Python 中的自定义错误消息

    所以我正在练习一些单元测试 我有一个关于错误消息的问题 我正在尝试创建一条自定义错误消息 该消息将在测试失败时显示 这是一个基本的 Hello World 程序 测试运行良好 一切正常 但这是我收到的错误消息 F FAIL test Str
  • ADO.NET 数据表约束如何影响性能?

    DataTable 上的约束 例如主键和唯一约束 是否可以像在 SQL Server 中一样使 Select 更高效 或者他们的唯一目的是对数据执行规则 myDT Constraints Add PK myDT Columns Unique
  • 即使链接具有定义的库后,也会出现“未定义的函数引用”问题

    我正在尝试使用 o so a 文件创建可执行文件 这是我的构建命令 pkgs gcc v4 8 3 bin gcc L usr X11R6 lib O2 DUSE FLEX Wall Wno char subscripts fPIC DLI
  • Visual Studio 调试器在内联代码中速度变慢

    自从我从 vs2005 升级到 Visual Studio 2008 以来 我在调试大型项目时发现了一个非常烦人的行为 如果我尝试单步执行内联代码 调试器似乎会锁定数十秒 每次我进入这样的函数时 都会出现类似的停顿 有没有人经历过这种情况并
  • Groovy 命名参数会导致参数分配发生切换——有什么办法可以解决这个问题吗?

    Groovy 会将所有命名参数收集到一个映射中 并将其作为第一个参数传递到方法中 这看起来很简洁 但是在尝试让它工作之后 它似乎真的无法使用 所以问题是这样的方法 def method paramMap specificVar1 7 spe
  • 在两个闪亮的应用程序之间切换

    所以我有两个独立的onefileshinyApps 带有 UI 和服务器 位于一个函数内 现在我需要做的是在第一个应用程序中调用第二个应用程序 这是一个简单的示例 功能被简化以显示我想要实现的功能 appOne lt function ap
  • 在汇编中仅设置零标志,不影响其他标志

    我需要在程序集中设置零标志 但它不应该更改任何其他标志 所以我正在考虑做pushf 将其弹出到eax 但我不知道如何为标志reg赋予新值 我能想到的 pushf pop eax or eax 000 1 00 set the locatio
  • 使用 nvm 使 node.js 文件可执行的最佳方法

    我在用着nvm https github com creationix nvm管理我的节点版本 我的node js可执行文件曾经像这样被sha bang ed usr local bin node但现在看来我必须做类似的事情 Users
  • 将字符串拆分为数组[重复]

    这个问题在这里已经有答案了 在 JS 中 如果您想将用户条目拆分到数组中 最好的方法是什么 例如 entry prompt Enter your name for i 0 i
  • 用 Latex 代码替换字符串向量中的重音符号

    Define df lt data frame name c M xico Michoac n dat c 1 2 s t gt df name dat 1 M xico 1 2 Michoac n 2 当我将此表打印到 tex文件使用xt
  • 为什么我们必须在 onClick 方法中添加“View”作为参数以及它的作用是什么?

    我正在 Android Studio 中的按钮上设置事件监听器 用于更改按钮内的文本TextView到了这一点 我们定义了OnClick方法 在其参数列表中要求View目的 谁能解释一下它的作用吗 我无法理解对象在哪里View类将会习惯 它