今天学习安卓应用中的按钮点击事件:

总结下来在安卓应用中的Button注册点击事件的方法主要是以下4种方法,稍后会逐个介绍:
第一种方法:自定义内部类的方法
第二种方法:匿名内部类的方法
第三种方法:当前Activity去实现事件接口的方法
第四种方法:在布局文件中添加点击事件属性的方法

首先新建一个Activity文件:

然后把一起自动生成的activity_button.xml文件中的最外层布局更改为线性布局

android:orientation="vertical" 是用于 线性布局(LinearLayout) 的一个核心属性,它决定了该布局内所有子视图(子控件)的排列方向

然后添加4个按钮控件:

下面来介绍第一种方法     自定义内部类的方法:

首先在第一个按钮中添加一个id为:btn1

然后在ButtonActivity.java文件中书写代码:

package com.example.android1;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.util.Log;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class ButtonActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_button);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});Button btn1 = findViewById(R.id.btn1);  //创建一个按钮类型的变量btn1 存放的是id为btn1的控件//点击事件,被点击是触发的事件//整体语法结构://  [类型] [变量名] = new [构造函数];Myclick mck = new Myclick();  //创建了一个名为 mck 的变量,它的类型是 Myclick 类,然后使用 new 关键字实例化(创建)了一个 Myclick 类的对象,并将这个对象赋值给变量 mckbtn1.setOnClickListener(mck);  //为按钮注册点击事件监听器}// 1	class	Java/Kotlin 中声明类的关键字。// 2	Myclick	类的名称。遵循大驼峰命名法(CamelCase),是您自己定义的标识符。// 3	implements	Java 中表示实现一个接口的关键字。(在 Kotlin 中使用 :)// 4	View.OnClickListener	要实现的接口的全限定名。View 是安卓的视图类,OnClickListener 是定义在 View 类内部的接口。//整体语法结构://[访问修饰符] class [类名] implements [接口名]//声明了一个名为 Myclick 的类,这个类实现了 View.OnClickListener 接口。这意味着 Myclick 类承诺将提供 OnClickListener 接口中定义的 onClick 方法的具体实现,从而成为一个可以处理按钮等视图点击事件的“点击监听器”。class Myclick implements View.OnClickListener{@Override  //这是一个给编译器看的“保证书”,保证下面的 onClick 方法是正确重写了接口中的方法,不是我自己随便写的新方法。   //编译器指令:我在重写接口的方法	确保正确重写,避免错误public void onClick(View view) {   //这是声明方法的规则,表示“当点击事件发生时,我会被调用,并且我会知道是哪个View被点击了”。  //方法声明:定义如何处理点击事件	实现接口契约,接收被点击的视图//在控制台输出语句Log.e("tag","通过自定义内部类实现点击事件的按钮被点击了");}}
}

最后修改注册文件:

都写完之后点击模拟如果有没有导入的情况就按照下面的方法来处理:

接下来就是模拟看日志输出了:

第二种方法:匿名内部类的方法

首先为第二个按钮添加一个id:btn2:

然后在ButtonActivity.java文件中添加代码:

所有的代码如下:

package com.example.android1;import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;import android.util.Log;
import android.widget.Button;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class ButtonActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_button);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});Button btn1 = findViewById(R.id.btn1);  //创建一个按钮类型的变量btn1 存放的是id为btn1的控件//点击事件,被点击是触发的事件//整体语法结构://  [类型] [变量名] = new [构造函数];Myclick mck = new Myclick();  //创建了一个名为 mck 的变量,它的类型是 Myclick 类,然后使用 new 关键字实例化(创建)了一个 Myclick 类的对象,并将这个对象赋值给变量 mckbtn1.setOnClickListener(mck);  //为按钮注册点击事件监听器//下面是第二种方法的实现:通过匿名内部类实现点击事件Button btn2=findViewById(R.id.btn2);btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.e("tag", "通过匿名内部类实现点击事件");}});}// 1	class	Java/Kotlin 中声明类的关键字。// 2	Myclick	类的名称。遵循大驼峰命名法(CamelCase),是您自己定义的标识符。// 3	implements	Java 中表示实现一个接口的关键字。(在 Kotlin 中使用 :)// 4	View.OnClickListener	要实现的接口的全限定名。View 是安卓的视图类,OnClickListener 是定义在 View 类内部的接口。//整体语法结构://[访问修饰符] class [类名] implements [接口名]//声明了一个名为 Myclick 的类,这个类实现了 View.OnClickListener 接口。这意味着 Myclick 类承诺将提供 OnClickListener 接口中定义的 onClick 方法的具体实现,从而成为一个可以处理按钮等视图点击事件的“点击监听器”。class Myclick implements View.OnClickListener{@Override  //这是一个给编译器看的“保证书”,保证下面的 onClick 方法是正确重写了接口中的方法,不是我自己随便写的新方法。   //编译器指令:我在重写接口的方法	确保正确重写,避免错误public void onClick(View view) {   //这是声明方法的规则,表示“当点击事件发生时,我会被调用,并且我会知道是哪个View被点击了”。  //方法声明:定义如何处理点击事件	实现接口契约,接收被点击的视图//在控制台输出语句Log.e("tag","通过自定义内部类实现点击事件的按钮被点击了");}}
}

最后模拟运行,看运行效果:

第三种方法:当前Activity去实现事件接口的方法

首先添加语句:

按照上图的方法点击,接着在点击下图的顺序自动填好要用的点击方法:

按照以上方法自动填充代码:

在里面写点击后的动作就好了:

整体代码如下:

package com.example.android1;import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;import android.util.Log;
import android.widget.Button;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class ButtonActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_button);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});Button btn1 = findViewById(R.id.btn1);  //创建一个按钮类型的变量btn1 存放的是id为btn1的控件//点击事件,被点击是触发的事件//整体语法结构://  [类型] [变量名] = new [构造函数];Myclick mck = new Myclick();  //创建了一个名为 mck 的变量,它的类型是 Myclick 类,然后使用 new 关键字实例化(创建)了一个 Myclick 类的对象,并将这个对象赋值给变量 mckbtn1.setOnClickListener(mck);  //为按钮注册点击事件监听器//下面是第二种方法的实现:通过匿名内部类实现点击事件Button btn2=findViewById(R.id.btn2);btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.e("tag", "通过匿名内部类实现点击事件");}});//  第三种方法:通过当前Activity实现点击事件接口Button btn3 = findViewById(R.id.btn3);btn3.setOnClickListener(this);}@Overridepublic void onClick(View view) {Log.e("tag", "通过当前Activity实现点击事件接口");}// 1	class	Java/Kotlin 中声明类的关键字。// 2	Myclick	类的名称。遵循大驼峰命名法(CamelCase),是您自己定义的标识符。// 3	implements	Java 中表示实现一个接口的关键字。(在 Kotlin 中使用 :)// 4	View.OnClickListener	要实现的接口的全限定名。View 是安卓的视图类,OnClickListener 是定义在 View 类内部的接口。//整体语法结构://[访问修饰符] class [类名] implements [接口名]//声明了一个名为 Myclick 的类,这个类实现了 View.OnClickListener 接口。这意味着 Myclick 类承诺将提供 OnClickListener 接口中定义的 onClick 方法的具体实现,从而成为一个可以处理按钮等视图点击事件的“点击监听器”。class Myclick implements View.OnClickListener{@Override  //这是一个给编译器看的“保证书”,保证下面的 onClick 方法是正确重写了接口中的方法,不是我自己随便写的新方法。   //编译器指令:我在重写接口的方法	确保正确重写,避免错误public void onClick(View view) {   //这是声明方法的规则,表示“当点击事件发生时,我会被调用,并且我会知道是哪个View被点击了”。  //方法声明:定义如何处理点击事件	实现接口契约,接收被点击的视图//在控制台输出语句Log.e("tag","通过自定义内部类实现点击事件的按钮被点击了");}}
}

最后就是模拟运行的结果了:

第四种方法:在布局文件中添加点击事件属性的方法

在布局文件中为第四个按钮添加一个属性叫onclick为其添加一个值为myclick(自定义的方法名)

然后在ButtonActivity.java文件中写布局文件中按钮绑定的方法,之后就可以模拟测试了:

第四种方法还可以绑定多个按钮,进入同一个方法内进行处理:

首先就是在布局中再添加一个按钮都要有id属性啊,绑定的都是同一种方法,具体是哪个按钮点击的就要去方法里面去分辨了:


然后在ButtonActivity.java中写myclick方法,之后模拟运行:

2025.9.7 今天早晨又增加了一个点击按钮后在界面上显示一串字符串的功能,感觉应该挺实用的的,以后肯定会用到,所以增加一点内容:先看效果:点击哪个按键就在文本框中显示哪个按钮被点击了。

下面展示一下布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ButtonActivity"android:orientation="vertical"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="30sp"android:text="按钮1"android:id="@+id/btn1"android:textSize="36sp"android:textColor="#FF0000"android:onClick="myclick"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="30sp"android:text="按钮2"android:id="@+id/btn2"android:textSize="36sp"android:textColor="#FF0000"android:onClick="myclick"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="30sp"android:text="按钮3"android:id="@+id/btn3"android:textSize="36sp"android:textColor="#FF0000"android:onClick="myclick"/><TextViewandroid:id="@+id/text1"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="36sp"android:textColor="#FF0000"android:layout_margin="30sp"android:background="#00FFFF"/></LinearLayout>

在展示一下ButtonActivity.java文件的代码:

package com.example.android1;import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class ButtonActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_button);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});}public void myclick(View a){int id = a.getId();   //获得被点击对象的IDTextView text = findViewById(R.id.text1);  //获得ID为text1的对象 为textif(id == R.id.btn1){Log.e("tag","按钮1被点击了");text.setText("按钮1被点击了");   //text对象设置文本}else if(id == R.id.btn2){Log.e("tag","按钮2被点击了");text.setText("按钮2被点击了");    //text对象设置文本}else if(id == R.id.btn3){Log.e("tag","按钮3被点击了");text.setText("按钮3被点击了");     //text对象设置文本}}
}

好了,磨磨蹭蹭的这篇文章写了一上午了,到此告一段落吧!也许我写的你觉得不好,不过没关系我写的是我学习的过程,是给我自己看的,觉得好呢?你就点个赞,不好呢?走就可以了,本人写作能力只有幼儿园的水平,请勿喷!谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95638.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95638.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95638.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙NEXT主题设置指南:应用级与页面级主题定制详解

在鸿蒙应用开发中&#xff0c;灵活的主题设置能力是实现个性化用户体验的关键技术&#xff0c;HarmonyOS NEXT提供了强大而灵活的主题设置功能&#xff0c;让开发者能够轻松实现应用级和页面级的主题定制。在当今追求个性化的时代&#xff0c;用户希望应用能够根据自己的喜好呈…

全球汽车氮化镓技术市场规模将于2031年增长至180.5亿美元,2025-2031年复合增长率达94.3%,由Infineon和Navitas驱动

全球汽车氮化镓技术市场规模将于2031年增长至180.5亿美元&#xff0c;2025-2031年复合增长率达94.3%&#xff0c;由Infineon和Navitas驱动汽车氮化镓技术正从一个有前景的细分市场加速进入主流电力电子领域。根据QYResearch&#xff08;恒州博智&#xff09;的《全球汽车GaN技术…

xftp断网后提示错误如何继续下载?

问题&#xff1a;xftp断网后提示错误如何继续下载&#xff1f;解决方法&#xff1a;断网后&#xff0c;先连接上网&#xff0c;然后继续双击右侧的那两个要传输的文件&#xff0c;然后会弹出一个覆盖还是继续下载&#xff08;如下图&#xff09;的选择框&#xff0c;选择继续下…

Day22_【机器学习—集成学习(4)—Boosting—GBDT算法】

提升树 &#xff08;Boosting Decision Tree &#xff09;每一个弱学习器通过拟合残差来构建强学习器梯度提升树 &#xff08;Gradient Boosting Decision Tree&#xff09;每一个弱学习器通过拟合负梯度来构建强学习器一、提升树残差数学公式为&#xff1a;残差真实值−预测值…

前缀和、子矩阵的和;差分、差分矩阵

一、前缀和数组要稍微注意前缀和数组从1开始#include <iostream>using namespace std;const int N 100010;int n, m; int a[N], s[N];int main() {scanf("%d%d", &n, &m);for (int i 1; i < n; i ) scanf("%d", &a[i]);for (int i…

启用BBR拥塞控制算法

目录 &#x1f4cb; 先决条件 &#x1f527; 启用步骤 &#x1f4dd; 额外检查与说明 ⚠️ 注意事项 BBR&#xff08;Bottleneck Bandwidth and Round-trip time&#xff09;是谷歌开发的一种TCP拥塞控制算法&#xff0c;它能有效提升网络传输速度和性能&#xff0c;尤其在…

Python:AI开发第一语言的全面剖析

文章目录引言1. Python的历史与AI开发的契合1.1 Python的诞生与设计哲学1.2 Python与AI发展的历史交汇2. 语言特性如何支持AI开发2.1 动态类型与交互式编程2.2 简洁优雅的语法2.3 高级数据结构的原生支持2.4 函数式编程特性2.5 强大的元编程能力3. 丰富的AI生态系统和库支持3.1…

Nikto 漏洞扫描工具使用指南

目录 ✨ 核心功能一览 &#x1f680; 基本使用方法 1. 扫描单个目标 2. 指定端口扫描 3. 扫描 HTTPS 目标 使用 -ssl 参数主要有两个核心原因 ⚙️ 高级使用技巧 1. 使用代理扫描 2. 保存扫描结果 3. 使用特定插件 4.交互命令 ✨ 核心功能一览 Nikto 是一款开源的 W…

FunASR的Java实现Paraformer实时语音识别 | 一款无需联网的本地实时字幕软件

0. 开发背景 我们在看直播时&#xff0c;没有视频字幕&#xff0c;可能看惯了视频字幕&#xff0c;来到直播中缺少字幕会感觉不习惯&#xff0c;特别是对于听力障碍的人群&#xff0c;只能依赖于字幕&#xff0c;那么这个软件可以解决直播&#xff0c;在线会议等场景中无字幕的…

从机器学习的角度实现 excel 中趋势线:揭秘梯度下降过程

1. 引言&#xff1a;Excel 的“一键魔法”背后藏着什么智慧&#xff1f;在 Excel 中&#xff0c;我们只需右键 → 添加趋势线&#xff0c;一条完美的直线就出现了。它快得像魔法&#xff0c;但魔法背后&#xff0c;是数学的严谨。今天&#xff0c;我们不关心 Excel 内部用了什么…

关于上拉电阻

上拉电阻的作用&#xff1a;辅助浮空状态输出高电平 其实就是确定这根线的电平&#xff0c;不能让他处于一种未知的状态。 其次也可以起到限制电流的作用&#xff0c;防止损坏原件 那么上拉电阻如何取值&#xff1f; 首先来看一下驱动能力。 因为线上是一定有寄生电容的&am…

PiscCode构建Mediapipe 手势识别“剪刀石头布”小游戏

在计算机视觉与人机交互领域&#xff0c;手势识别是一个非常有趣的应用场景。本文将带你用 Mediapipe 和 Python 实现一个基于摄像头的手势识别“剪刀石头布”小游戏&#xff0c;并展示实时手势与游戏结果。 1. 项目概述 该小游戏能够实现&#xff1a; 实时检测手势&#xff0…

【VoNR】VoNR 不等于 VoLTE on 5G

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

计算机网络:网络设备在OSI七层模型中的工作层次和传输协议

OSI七层模型&#xff08;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层&#xff09;中&#xff0c;不同网络设备因功能不同&#xff0c;工作在不同层次。以下是典型网络设备的工作层次及核心功能&#xff1a;1. 物理层&#xff08;第1层&#xff09; 核心功能&a…

RSA-e和phi不互素

1.题目import gmpy2 import libnum p 1656713884642828937525841253265560295123546793973683682208576533764344166170780019002774068042673556637515136828403375582169041170690082676778939857272304925933251736030429644277439899845034340194709105071151095131704526…

基于单片机蒸汽压力检测/蒸汽余热回收

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;单片机作品题目速选一览表&#x1f680; &#x1f449;&#x1f449;&#x1f449;&#x1f449;单片机作品题目功能速览&#x1f680; &#x1f525;更多文章戳&#x1f449;小新单片机-CSDN博客&#x1f68…

https 协议与 wss 协议有什么不同

HTTPS 是用于网页数据传输的安全协议&#xff0c;而 WSS 是用于实时双向通信&#xff08;如聊天、直播&#xff09;的安全协议&#xff0c;二者的设计目标、应用场景、底层逻辑均存在本质区别。以下从 7 个核心维度展开对比&#xff0c;并补充关键关联知识&#xff0c;帮助彻底…

主流分布式数据库集群选型指南

以下是关于主流分布式可扩展数据库集群的详细解析&#xff0c;涵盖技术分类、代表产品及适用场景&#xff0c;帮助您高效选型&#xff1a;一、分布式数据库核心分类 1. NewSQL 数据库&#xff08;强一致性 分布式事务&#xff09;产品开发方核心特性适用场景TiDBPingCAPHTAP架…

#T1359. 围成面积

题目描述编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示&#xff0c;在1010的二维数组中&#xff0c;有“*”围住了15个点&#xff0c;因此面积为15。输入1010的图形。输出输出面积。样例输入数据 10 0…

Hive on Tez/Spark 执行引擎对比与优化

在大数据开发中,Hive 已经成为最常用的数据仓库工具之一。随着业务数据规模的不断扩大,Hive 默认的 MapReduce 执行引擎 显得笨重低效。为了提升查询性能,Hive 支持了 Tez 和 Spark 作为底层执行引擎。本文将带你对比 Hive on Tez 与 Hive on Spark 的区别,并分享调优经验。…