Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> Android事件處理

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 文件的內容:

<?xml version="1.0" encoding="utf-8"?> <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" /> </LinearLayout>

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

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">EventDemo - yiibai.com</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="button_small">小號字體</string> <string name="button_large">大號字體</string> </resources>

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

<?xml version="1.0" encoding="utf-8"?> <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" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

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

Android事件處理

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

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

在這裡,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安裝的應用程序,並啟動它,如果一切設置和應用都沒有問題,它會顯示以下模擬器窗口:

\

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

使用布局文件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" ,這將注冊給定的方法名,以添加單擊事件處理程序。

<?xml version="1.0" encoding="utf-8"?> <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" /> </LinearLayout>

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

\

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved