安卓學習筆記07:事件處理、窗口跳轉與傳遞數據
標簽: 安卓應用開發
文章目錄
零、學習目標
- 會使用線性布局和三個基本控件設計用戶界面
- 能說出安卓事件處理機制的實現步驟
- 能編寫代碼完成安卓應用的事件處理
- 會使用Intent控件實現窗口的跳轉
- 會在不同的窗口之間傳遞數據(Bundle)
一、三個基本控件
1、標簽控件(TextView)
- 類層次繼承圖
- 常用屬性:text、textSize、textColor……
2、編輯框控件(EditText)
- 類層次繼承圖
- 常用屬性:text、textSize、textColor、hint……
3、按鈕控件(Button)
- 類層次繼承圖
- 常用屬性:text、background、layout_width、layout_height……
二、安卓事件處理機制
(一)安卓事件處理概述
- 不論是桌面應用還是手機應用程序,需要對用戶的動作提供響應,這種為用戶動作提供響應的機制就是事件處理。
- 安卓提供了兩種事件處理機制:基于回調的事件處理和基于監聽的事件處理。
- 基于監聽的事件處理是一種“面向對象”的事件處理,涉及三種對象:事件源(EventSource)、事件(Event)、事件監聽器(EventListener)。
- 基于監聽的事件處理流程圖
(二)安卓事件處理步驟
- 以按鈕單擊事件處理為例說明安卓事件處理步驟
- 在界面類里聲明按鈕控件變量
- 通過findViewById()方法得到按鈕實例
- 利用setOnClickListener()方法給按鈕注冊單擊事件監聽器
- 實現單擊事件監聽器接口,采用匿名實現方式
- 在接口的抽象方法里編寫事件處理代碼
三、案例演示:實現用戶登錄功能
《安卓學習筆記04》課后作業讓大家做一個登錄窗口,本案例對按鈕進行事件處理,如果登錄成功,彈出吐司提示用戶登錄成功,否則彈出吐司提示用戶登錄失敗。
(一)運行效果
(二)涉及知識點
- 線性布局(LinearLayout)
- 標簽(TextView)
- 編輯框(EditText)
- 按鈕(Button)
- 安卓事件處理機制
- 吐司(Toast)
(三)實現步驟
1、創建安卓應用【UserLogin】
2、添加背景圖片
- 將背景圖片background.jpg放在res/drawable目錄
3、基于模板創建登錄窗口LoginActivity
- 基于Empty Activity模板創建
4、登錄窗口布局資源文件activity_login.xml
- gravity:用于設置容器的子控件的對齊方式,或控件的內容的對齊方式
- orientation:線性布局的方向(horizontal——橫向、vertical——縱向)
- padding:內邊距,用于設置子控件與父容器邊框的距離,或控件的內容與控件邊框的距離;(paddingLeft、paddingRight、paddingTop、paddingBottom)
- layout_margin:外邊距,用于設置控件之間的距離;(layout_marginLeft,layout_marginRight、layout_marginTop、layout_marginBottom)
- hint:用于設置編輯框的提示內容,當編輯框為空時就顯示出來,一旦有內容就立馬消失。
- singleLine:用于設置編輯框是否為單行輸入,取值為“true”,那就是單行輸入。
5、主窗口布局資源文件activity_main.xml
6、項目清單文件
- 刪除MainActivity元素的意圖過濾器
7、字符串資源文件strings.xml
<resources>
<string name="app_name">用戶登錄</string>
<string name="user_login">用戶登錄</string>
<string name="username">用戶:</string>
<string name="input_username">請輸入用戶名</string>
<string name="password">密碼:</string>
<string name="input_password">請輸入密碼</string>
<string name="login">登錄</string>
<string name="cancel">取消</string>
</resources>
8、登錄窗口LoginActivity
(1)聲明控件變量
(2)通過資源標識符獲取控件實例
(3)登錄按鈕事件處理
- 給登錄按鈕注冊監聽器,實現監聽器接口,并且編寫事件處理代碼
(4)取消按鈕事件處理
- 給取消按鈕注冊監聽器,實現監聽器接口,并且編寫事件處理代碼
9、啟動應用,查看效果
(1)輸入用戶名與密碼正確的情況
(2)輸入用戶名或密碼錯誤的情況
四、利用意圖啟動組件
(一)使用顯式意圖啟動組件
- 假設有兩個窗口:FirstActivity和SecondActivity
方式一
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
方式二
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
startActivity(intent);
方式三
Intent intent = new Intent();
ComponentName component = new ComponentName(FirstActivity.this, SecondActivity.class);
intent.setComponent(component);
startActivity(intent);
(二)使用隱式意圖啟動組件
1、在Java代碼創建隱式意圖
Intent intent = new Intent();
intent.setAction("net.hw.ACTION_NEXT");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
2、在項目清單文件里設置意圖過濾器
<activity android:name="net.hw.SecondActivity">
<intent-filter>
<action android:name="net.hw.ACTION_NEXT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
五、利用意圖傳遞數據
(一)傳遞單項數據
- 在起始組件通過意圖傳遞單項數據
// 通過意圖傳遞單項數據
intent.putExtra("username", strUsername);
intent.putExtra("password", strPassword);
- 在目標組件通過意圖獲取單項數據
// 通過意圖獲取單項數據
String username = intent.getStringExtra("username");
String password = intent.getStringExtra("password");
(二)傳遞數據包
1、在起始組件通過意圖攜帶數據包
// 創建數據包,封裝數據
Bundle data = new Bundle();
data.putString("username", strUsername);
data.putString("password", strPassword);
// 通過意圖攜帶數據包
intent.putExtras(data);
2、在目標組件通過意圖獲取數據包
// 獲取意圖攜帶的數據包
Bundle data = intent.getExtras();
// 從數據包里按鍵取值獲取各項數據
String username = data.getString("username");
String password = data.getString("password");
(三)傳遞實體對象
1、傳遞實現了Serializable接口的實體對象
- 參看【六、案例演示:修改用戶登錄程序】
2、傳遞實現了Parcelable接口的實體對
六、案例演示:修改用戶登錄程序
當登錄成功,跳轉到主窗口,顯示用戶名與密碼。
(一)運行效果
(二)涉及知識點
- 線性布局(LinearLayout)
- 標簽(TextView)
- 編輯框(EditText)
- 按鈕(Button)
- 安卓事件處理機制
- 吐司(Toast)
- 意圖(Intent)
(1)功能作用:聯系安卓不同組件之間的一個重要橋梁
(2)使用方式:本案例采用顯式意圖啟動組件方式實現窗口跳轉
(三)實現步驟
1、修改登錄界面LoginActivity
- 創建顯式意圖,利用意圖攜帶數據,按照意圖啟動目標組件
2、修改主界面MainActivity
- 接收登錄界面通過意圖傳遞的數據并顯示在標簽里
3、啟動應用,查看效果
(1)輸入用戶名與密碼正確的情況
(2)輸入用戶名或密碼錯誤的情況
4、修改登錄界面LoginActivity
5、修改主界面MainActivity
6、啟動應用,測試效果
7、創建用戶實體類
- 創建用戶實體類,實現Serializable接口
package net.hw.userlogin;
import java.io.Serializable;
/**
* 功能:用戶類
* 作者:華衛
* 日期:2020年09月17日
*/
public class User implements Serializable {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
8、修改登錄界面LoginActivity
9、修改主界面MainActivity
10、啟動應用,測試效果
七、課后作業
任務:實現用戶注冊功能
- 注冊窗口
- 顯示注冊信息窗口
智能推薦
案例講解安卓的事件傳遞機制
首先關于安卓的事件傳遞機制我們需要知道一些東西: View的繼承關系,有關事件的幾個方法: 跟Touch事件有關的處理方法主要有三個: //分派事件 public boolean dispatchTouchEvent(MotionEvent ev) //攔截事件 public boolean onInterceptTouchEvent(MotionEvent ev) //處理事件 public b...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
猜你喜歡
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...