Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android UI Event Listener

Android UI Event Listener

編輯:Android開發實例

處理UI事件

在android上, 有多種方法獲取用戶與應用程序的交互信息. 當考慮UI內部的事件時, 我們的方法是抓取特定的與用戶交互的View對象產生的事件.

在你用來組成布局的View對象中,你可能會注意到一些用於處理UI事件的回調函數. 這些方法是被Android框架調用的. 例如,當一個View被按下時, 它的onTouchEvent()方法被調用. 但是,為了截獲這個信息,你必須擴展這個類並改寫這個方法. 而擴展每個View對象來處理這樣的事件可能是不實際的. 這就是為什麼View類還包含一組你可以更方便定義的嵌套接口. 這些接口被稱為監聽器, 它們是你用來抓取用戶動作的利器.

雖然你可能更加常用事件監聽器來監聽用戶動作, 有時候你可能確實希望通過擴展一個View類的方法來做這一點. 可能你希望擴展Button類來做一些巧妙的事情. 在這個情況下, 你能夠使用時間處理器來定義該類的默認的事件行為.

Event Listeners 事件監聽器

一個事件監聽器是View類的一個接口. 該接口包含的方法會在View注冊的事件監聽器被觸發時被Android調用.

在事件監聽器中有下列方法:

  • onClick() 位於View.OnClickListener中. 在用戶觸摸該對象,或者使用軌跡球等使該對象獲得焦點, 並按下"enter"鍵或者按下軌跡球時被調用.
  • onLongClick() 位於 View.OnLongClickListener中. 在用戶按住該元素,或者按住軌跡球時調用.
  • onFocusChange() 位於 View.OnFocusChangeListener中. 該對象獲得或失去焦點時調用.
  • onKey() 位於 View.OnKeyListener中. 在該對象獲得焦點,並且按下一個鍵時調用.
  • onTouch() View.OnTouchListener. 當用戶在View對象的范圍內進行一個觸摸動作時. 例如按下,放開,或者任何的移動手勢.
  • onCreateContextMenu() View.OnCreateContextMenuListener. 當一個快捷菜單被顯示時(當用戶長按).

這些方法只是它們對應接口的唯一方法. 為了定義這些方法, 可以在你的Activity中實現這個接口, 也可以使用一個匿名類. 然後, 將實現該接口實例傳給對應的View.set...Listener方法.

以OnClickListener為例:


// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}


你可能覺得將OnClickListener 實現為activity的一部分會更加方便. 這可以避免額外的類. 例如:


public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
        Button button = (Button)findViewById(R.id.corky);
        button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
    ...
}


注意 onClick() 沒有返回值, 但有些事件監聽器必須有一個布爾返回值. 下面是一些原因:

  • onLongClick() - 返回一個布爾值表示你是否消耗了該event. 也就是,如果你已經處理了該event, 則它應該停止了,就返回true, 而如果你沒有處理它,而是將它留給其它的on-click監聽器, 則返回false.
  • onKey() - 同上.
  • onTouch() - 返回一個布爾值表示你是否消耗了該event. 該event可以有多個動作. 如果在向下的動作接收時你返回false, 就表示你沒有消耗該event, 並且對後續動作也不感興趣. 也就是說, 後面的手勢動作,以及最後的向上動作都將不會再被通知.

鍵事件永遠會被發送到當前獲得焦點的View. 它們是從View層次的頂端開始分派, 然後向下直到合適的目的地. 如果你的View現在擁有焦點, 那麼你可以從dispatchKeyEvent()方法中看到事件的分派過程. 除了使用veiw之外,你也可以使用你的Activity的onKeyDown()和onKeyUp()方法來獲取所有的時間.

 

注意: Android將首先調用事件處理器, 然後調用合適的默認處理器. 因此, 從這些事件監聽器中返回true將使其它監聽器和默認處理器失效. 因此在你返回true時要小心.

Event Handlers 事件處理器

如果你從View來創建一個自定義的component,那麼你可以定義一些默認事件處理器。在 Building Custom Components文檔中,你將看到這些回調函數:

  • onKeyDown(int, KeyEvent) -當一個新的鍵盤時間開始被調用。
  • onKeyUp(int, KeyEvent) -當一個鍵被釋放時調用。
  • onTrackballEvent(MotionEvent) -當軌跡球移動時調用。
  • onTouchEvent(MotionEvent) - 當屏幕發生移動事件時調用。
  • onFocusChanged(boolean, int, Rect) -當一個View丟失焦點時調用。

有一些不屬於View,但是也能直接影響到事件處理的方法:

  • Activity.dispatchTouchEvent(MotionEvent) -可以在這些事件被分派到窗口之前讓Activity截獲所有的事件。
  • ViewGroup.onInterceptTouchEvent(MotionEvent) -讓ViewGroup在事件分派到子View之前看到這些事件。
  • ViewParent.requestDisallowInterceptTouchEvent(boolean) - 讓父View不要使用onInterceptTouchEvent(MotionEvent)來截獲event.

Touch Mode 觸摸模式

但一個用戶使用方向鍵或者軌跡球來在UI上移動時, 需要讓可動作的UI元素獲得焦點, 這樣用戶可以看到什麼東西將獲得他們的輸入。如果設備具有觸摸能力,用戶使用觸摸的方式來交互,那麼就沒有必要給一個元素焦點。因此,有一種交互的模式叫做“觸摸模式”。

對於一個可觸摸的設備,一旦用戶觸摸了屏幕,設備就進入觸摸模式。在這以後,只有isFocusableInTouchMode()為真的View是可以獲得焦點的, 例如文本框。其它的View可以觸摸,例如按鈕,在觸摸的時候不會獲得焦點。它們只是啟動對應的on-click監聽器。在用戶按下方向鍵或者旋轉軌跡球時,設備將退出觸摸模式,並尋找一個view並使他獲得焦點。現在,用戶可以不觸摸屏幕來交互。

觸摸模式狀態在整個系統中被維護。你可以使用isInTouchMode()來查詢當前狀態。

Handling Focus 處理焦點

android框架會根據用戶輸入來處理焦點的移動。這包含了在View被移除或隱藏或再次出現時改變焦點。View使用isFocusable()和setFocusable()方法來表示和設置它們能否獲得焦點。在觸摸模式下,可以使用isFocusableInTouchMode()和setFocusableInTouchMode().。

焦點移動時基於在某方向上最近距離元素的算法。在很少見的情形下,默認的算法可能和開發者的想法不一樣。在這種情況下,你可以提供一個算法,修改以下幾個xml屬性:nextFocusDown, nextFocusLeft, nextFocusRight和 nextFocusUp. 例如:


<LinearLayout
    android:orientation="vertical"
    ... >
  <Button android:id="@+id/top"
          android:nextFocusUp="@+id/bottom"
          ... />
  <Button android:id="@+id/bottom"
          android:nextFocusDown="@+id/top"
          ... />
</LinearLayout>


一般來說,在這個豎直向下的布局中,從第一個按鈕向上不會走到哪裡。加入上述代碼後,從第一個按鈕向上會使第二個按鈕獲取焦點。

如果你希望將一個View設為可獲取焦點,那麼加入xml屬性android:focusable="true" 和 android:focusableInTouchMode = "true".

希望一個View獲得焦點時,調用requestFocus().

要監聽焦點事件,使用onFocusChange()。

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