为什么我们必须在 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”作为参数以及它的作用是什么? 的相关文章

  • 加快 ImageView 中的缩放功能

    我目前正在处理非常大的图像 7 10mb 由于多种原因无法调整大小或压缩 现在 我们的想法是在自定义 ImageView 中显示它们 使用户能够进行双击缩放 捏合缩放等 我使用这个库来完成这项工作 https github com Mike
  • Android 改变 ImageView / Bitmap 的颜色

    我需要找到一种方法来改变 Android 中位图的颜色 我需要在我的应用程序中平滑地替换 更改椭圆形图像的颜色 具体取决于int价值 我需要类似的东西myValue 5比改变我的图像的颜色RED and if myValue 322将颜色更
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 通过列表视图检查动态生成的复选框时遇到问题

    我知道其他成员已经提出了这个问题 一些成员也给出了解决方案 但问题是我没有找到任何适合我的应用程序的解决方案 我正在创建一个应用程序 其中我有一个屏幕 它将显示动态列表视图 其中包含列表项 复选框和三个文本视图 一个用于候选人姓名 另外两个
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 如何在Android Compose中使用otf类型字体文件?

    我正在学习使用 Android Jetpack Compose 现在我有一个正则 otf字体文件在资产 字体 我想在文本中使用它 java lang RuntimeException Font asset not found commonu
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • 检测 ListView(或 ScrollView)内的滚动位置

    我正在构建一个聊天室应用程序 其中每 X 秒就会轮询一次新事件 每次发生这种情况时 此代码都会使用新数据更新 RoomAdapter ArrayAdapter 的自定义子类 并将其滚动到底部 RoomAdapter adapter Room
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • 在状态栏下方显示DialogFragment内容

    我试图显示高度和宽度均具有 match parent 的 DialogFragment 但碰巧在顶部 DialogFragment 显示在 StatusBar 下方 DialogFragment 正在应用一些默认值来填充底部 右侧 左侧和顶
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 如何以编程方式创建活动转换?

    我想以编程方式创建一个动画 以从触摸屏点启动具有缩放效果的活动 接下来我模拟缩放输入效果

随机推荐

  • 如何从 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类将会习惯 它