Android開發教學
Android 開發環境配置
Android 架構
Android 應用組件
Android Hello World示例
Android 資源組織和訪問
Android Activity
Android Service
Android廣播接收器
Android內容提供者
Android碎片/片段
Android Intent過濾器
Android UI佈局
Android LinearLayout
Android RelativeLayout
Android TableLayout
Android AbsoluteLayout
Android FrameLayout
Android ListView
Android GridView
Android UI控件
Android TextView
Android EditText
Android AutoCompleteTextView
Android Button
Android ImageButton
Android CheckBox
Android ToggleButton
Android RadioButton
Android RadioGroup
Android事件處理
Android樣式和主題
Android樣式示例
Android主題示例
Android自定義組件
Android拖放
Android通知
Android基於位置服務
Android發送電子郵件
Android發送短信/SMS
Android撥打電話
發佈Android應用
ArrayAdapter
SimpleCursorAdapter
Android ProgressDialog
Android Spinner
使用活動代碼自定義Android組件
使用佈局文件自定義Android組件
Android自定義組件及屬性
Android Alertdialog(警告對話框)
Android Animation(動畫)實例
Android音頻捕獲(錄音)
Android音頻管理器實例
Android AutoCompleteTextView(自動完成)實例
Android最佳實踐
Android Bluetooth(藍牙)實例
Android Camera(攝像頭)
Android Clipboard(複製/剪貼板)
Android自定義字體
Android數據備份
Android Gestures/手勢
Android圖片效果
Android圖片切換
Android內部存儲
Android JetPlayer實例
Android JSON解析器
Android加載Spinner
Android本地化
Android登錄實例
Android MediaPlayer(多媒體播放)

Android事件處理

事件是一種有用來收集用戶與應用程序互動數據的互動組件,如按鍵或觸摸屏等放置事件,因爲每個事件從Android框架維護事件隊列先入先出(FIFO)基礎上的隊列。可以在程序中捕獲這些事件,按要求並採取適當的動作。

有以下三個概念涉及到Android事件管理:

  • 事件監聽器: 主要涉及建立一個Android的GUI視圖類,View類提供了一些事件監聽器。事件監聽器是對象接收通知在事件發生時。

  • 事件監聽器註冊: 事件註冊事件處理程序被註冊了事件偵聽器的過程,使該處理調用的事件偵聽器觸發事件。

  • 事件處理程序: 當一個事件發生時,已註冊的事件和事件監聽器,事件監聽器調用事件處理程序,這是實際處理事件的方法。

事件偵聽器和事件處理程序

事件處理程序

事件監聽器說明

onClick()

OnClickListener()
當用戶點擊任意或觸摸或焦點事件像按鈕,文字,圖片等,將使用onClick()事件處理程序來處理任何部件的事件

onLongClick()

OnLongClickListener()
當用戶點擊或觸摸或焦點事件像按鈕,文本,圖像等,爲1秒以上的任何插件時被調用。使用onLongClick()事件處理程序來處理這樣的事件

onFocusChange()

OnFocusChangeListener()
當控件失去焦點時被調用。用戶進入離開視圖項目。使用onFocusChange()事件處理程序來處理這樣的事件

onKey()

OnFocusChangeListener()
當用戶焦點並按下或釋放裝置上的硬件鍵時被調用。將使用onKey()事件處理程序來處理這樣的事件

onTouch()

OnTouchListener()
當用戶按下該鍵時及釋放鍵,或在屏幕上的任何移動手勢時被調用。使用onTouch()事件處理程序來處理這樣的事件

onMenuItemClick()

OnMenuItemClickListener()
當用戶選擇一個菜單項時被調用。使用onMenuItemClick()事件處理程序來處理這樣的事件

還有更多可用作爲View類如:OnHoverListener,OnDragListener 等,應用程序可能需要一部分的事件偵聽器。因此,建議參考官方Android應用程序開發文檔,開發一個複雜的應用程序。

註冊事件監聽器:

事件註冊事件處理程序被註冊事件偵聽器的過程,使處理時調用事件偵聽器處理事件。雖然有一些方法註冊可以任何事件的事件偵聽器,但要列出只前3種方式,可以根據實際情況使用。

  • 使用匿名內部類

  • Activity 活動類實現Listener接口

  • 使用佈局文件 activity_main.xml 直接指定事件處理程序(方法)

下面將提供三種情景的詳細的例子:

事件處理舉例

使用匿名內部類的事件監聽器註冊

在這裏,將創建一個匿名的執行監聽,如果每個類只有一個單控制器,將參數傳遞給事件處理程序。在這種方法中的事件處理方法可以訪問私有數據的活動。沒有提及需要調用到活動。

但是,如果聲明一個以上處理程序的控制器,剪切和粘貼代碼的處理程序和處理程序的代碼很長,代碼更難維護。

以下是簡單的步驟來展示我們將如何利用獨立的 Listener類 註冊並捕獲點擊(click)事件。類似的方式,可以實現所需的任何其他事件類型的偵聽。

步驟

描述

1

使用Android Studio創建一個Android應用程序項目,將其命名爲:EventDemo

2

修改 src/MainActivity.java 程序文件,以添加 click事件偵聽器並處理程序定義的兩個按鈕

3

修改 res/layout/activity_main.xml 文件的默認內容包括Android的UI控件

4

定義res/values/strings.xml 文件所需的常量

5

運行該應用程序啓動Android模擬器並驗證應用程序所做的修改結果

以下是主 activity 文件src/com.yiibai.eventdemo/MainActivity.java 的內容。這個文件可以包括每個生命週期的根本方法。

package com.yiibai.eventdemo; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //--- find both the buttons--- Button sButton = (Button) findViewById(R.id.button_s); Button lButton = (Button) findViewById(R.id.button_l); // -- register click event with first button --- sButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // --- find the text view -- TextView txtView = (TextView) findViewById(R.id.text_id); // -- change text size -- txtView.setTextSize(14); } }); // -- register click event with second button --- lButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // --- find the text view -- TextView txtView = (TextView) findViewById(R.id.text_id); // -- change text size -- txtView.setTextSize(24); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }

下面是 res/layout/activity_main.xml 文件的內容:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button_s" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/button_small"/> <Button android:id="@+id/button_l" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/button_large"/> <TextView android:id="@+id/text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:capitalize="characters" android:text="@string/hello_world" />

以下文件 res/values/strings.xml 定義了兩個新的常量:

<string name="app_name">EventDemo - yiibai.com <string name="action_settings">Settings <string name="hello_world">Hello world! <string name="button_small">小號字體 <string name="button_large">大號字體

以下是 AndroidManifest.xml 文件的默認內容:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yiibai.guidemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.yiibai.guidemo.MainActivity" android:label="@string/app_name" > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />

我們嘗試運行EventDemo 應用程序。AVD安裝的應用程序,並啓動它,如果一切設置和應用都沒有問題,它會顯示以下模擬器窗口:

Android事件處理

現在嘗試一下,會看到兩個按鈕逐一的Hello World文本,字體會發生變化,對每次點擊事件發生,因爲註冊的click事件處理方法被調用。

以上代碼下載:http://pan.baidu.com/s/1hqrIjx6  

註冊使用活動實現監聽器接口

在這裏,activity類實現Listener接口方法處理主活動,然後調用setOnClickListener(this)程序。

如果應用程序只有一個單一的控件這種方法是很好的,但需要做進一步的編程檢查控制生成的事件(監聽器類型)。第二不能將參數傳遞到監聽器,多個控件時不能起作用。

下面是簡單的步驟來展示如何實現Listener類註冊並捕獲click事件。類似的方式,可以實現所需的任何其他事件類型的監聽。

步驟

描述

1

我們需要創建一個Android應用程序 :EventDemo2

2

修改 src/MainActivity.java 文件的內容,以添加click事件偵聽器和處理程序定義的兩個按鈕

3

上一個例子中的 res/layout/activity_main.xml 文件不用做任何改變,它仍將如上圖所示。

4

上一個例子中的 res/values/strings.xml 文件不做任何變化,如上圖所示。

5

運行該應用程序啓動Android模擬器並驗證應用程序所做的修改結果。

以下是主活動活動文件 src/com.yiibai.eventdemo2/MainActivity.java 的內容。這個文件可以包括每個生命週期基礎方法。

package com.example.eventdemo; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //--- find both the buttons--- Button sButton = (Button) findViewById(R.id.button_s); Button lButton = (Button) findViewById(R.id.button_l); // -- register click event with first button --- sButton.setOnClickListener(this); // -- register click event with second button --- lButton.setOnClickListener(this); } //--- Implement the OnClickListener callback public void onClick(View v) { if(v.getId() == R.id.button_s) { // --- find the text view -- TextView txtView = (TextView) findViewById(R.id.text_id); // -- change text size -- txtView.setTextSize(14); return; } if(v.getId() == R.id.button_l) { // --- find the text view -- TextView txtView = (TextView) findViewById(R.id.text_id); // -- change text size -- txtView.setTextSize(24); return; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }

我們嘗試運行EventDemo2 應用程序。AVD安裝的應用程序,並啓動它,如果一切設置和應用都沒有問題,它會顯示以下模擬器窗口:

Android事件處理

現在嘗試一下,會看到兩個按鈕被點擊後 "Hello World" 文本字體會發生變化,對每次點擊事件,註冊的 click 事件處理方法被調用。

上面例子程序代碼下載地址:http://pan.baidu.com/s/1i3pEvpr  

使用佈局文件ACTIVITY_MAIN.XML註冊

在這裏事件處理程序Activity類沒有實現監聽器接口,也沒有註冊任何偵聽器方法。相反使用佈局文件(activity_main.xml),通過android:onClick屬性指定的處理程序方法click事件。可以控制​​不同的點擊事件不同的控制,通過不同的事件處理方法。 

事件處理程序方法必須有一個返回類型爲void,並作爲一個參數來檢視。方法名稱可以是任意的,主類不需要實現任何特定的接口。

這種方法不會允許將參數傳遞給監聽器,Android開發人員將很難知道哪種方法處理程序控制,需要到activity_main.xml文件查看才能知道。其次,不能處理除click事件外的任何其他事件。

以下是簡單的步驟來展示如何能利用佈局main.xml文件註冊並捕獲click事件。

步驟

描述

1

創建一個Android應用程序項目:EventDemo3.

2

修改src/MainActivity.java文件,以添加定義兩個按鈕的click事件偵聽器和處理程序

3

修改佈局文件 res/layout/activity_main.xml,指定這兩個按鈕的事件處理程序

4

文件 res/values/strings.xml 不用做修改,使用上面的例子中的內容就可以

5

運行該應用程序啓動Android模擬器並驗證應用程序所做的修改結果。

以下是修改主活動文件src/com.yiibai.eventdemo/MainActivity.java的內容。這個文件可以包括每個生命週期的基本方法。

package com.example.eventdemo; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //--- Implement the event handler for the first button. public void doSmall(View v) { // --- find the text view -- TextView txtView = (TextView) findViewById(R.id.text_id); // -- change text size -- txtView.setTextSize(14); return; } //--- Implement the event handler for the second button. public void doLarge(View v) { // --- find the text view -- TextView txtView = (TextView) findViewById(R.id.text_id); // -- change text size -- txtView.setTextSize(24); return; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }

將以下的 res/layout/activity_main.xml 文件的內容。在這裏,我們必須給這兩個按鈕添加 android:onClick="methodName" ,這將註冊給定的方法名,以添加單擊事件處理程序。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button_s" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/button_small" android:onClick="doSmall"/> <Button android:id="@+id/button_l" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/button_large" android:onClick="doLarge"/> <TextView android:id="@+id/text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:capitalize="characters" android:text="@string/hello_world" />

我們嘗試運行EventDemo3 應用程序。AVD上安裝的應用程序,並啓動它,如果一切設置和應用都沒有問題,它會顯示以下模擬器窗口:

Android事件處理

現在嘗試一下,會看到兩個按鈕的 Hello World文本的字體會發生變化,對每次點擊事件,註冊的click事件處理方法被調用。

以上代碼下載地下:http://pan.baidu.com/s/1nthyBDR