安卓學習 之 按鈕點擊事件

今天學習安卓應用中的按鈕點擊事件:

總結下來在安卓應用中的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 的區別,并分享調優經驗。…