輸入事件總覽

試用 Compose
Jetpack Compose 是 Android 推薦的 UI 工具包。瞭解如何在 Compose 中使用觸控和輸入功能。

在 Android 裝置上,您可以透過幾種方法攔截使用者與您應用程式互動的事件。 在考慮使用者介面中的事件時,方法是從 與使用者互動的特定 View 物件View 類別可提供這項功能。

在您用來設計版面配置的各種 View 類別中,您可能會注意到多個公開回呼 最適合用於 UI 事件的方法。Android 架構會在 也會對物件產生相對應的動作舉例來說,使用者輕觸檢視畫面 (例如按鈕) 時, 系統會對該物件呼叫 onTouchEvent() 方法。但是,為了攔截此一報導,您必須擴充 並覆寫方法但擴充每個 View 物件 來處理這類事件並不可行。這就是 View 類別也包含的原因 一組巢狀結構介面,以及可更輕鬆地定義的回呼。這類介面 稱為事件監聽器,讓您用來擷取使用者與使用者介面的互動。

雖然事件監聽器較常用於監聽使用者互動,但 當您想要擴充 View 類別來建立自訂元件時 您可能會想擴充 Button 增添一點趣味在這個例子中,您可以替 透過類別事件處理常式使用類別。

事件監聽器

事件監聽器是 View 類別中的介面,其中包含單一 回呼方法。當監聽器的 View 位置時,Android 架構就會呼叫這些方法 當使用者與使用者介面項目互動時,就會觸發登錄這個事件。

事件監聽器介麵包含以下回呼方法:

onClick()
來自 View.OnClickListener。 使用者輕觸項目時,系統就會呼叫此方法 (在觸控模式下),或者以瀏覽鍵或軌跡球將焦點移至項目, 按下適當的「Enter」鍵鍵或按下軌跡球的向下按鍵。
onLongClick()
來自 View.OnLongClickListener。 使用者輕觸並按住項目 (觸控模式時) 或 以瀏覽鍵或軌跡球著重在項目上 按住合適的「Enter」鍵鍵或按住軌跡球 (一秒) 。
onFocusChange()
來自 View.OnFocusChangeListener。 在使用者使用導覽鍵或軌跡球前往或離開某項目時,系統會呼叫此方法。
onKey()
來自 View.OnKeyListener。 當使用者將焦點移至該項目,然後按下或釋放裝置上的硬體按鍵時,系統就會呼叫此方法。
onTouch()
來自 View.OnTouchListener。 當使用者執行符合觸控事件 (包括新聞、放開或捐款) 的動作時,系統就會呼叫此方法 螢幕上的任何動作手勢 (在項目邊界內)。
onCreateContextMenu()
來自 View.OnCreateContextMenuListener。 在建立內容選單時(持續「長按」動作的結果),系統就會呼叫此方法。查看討論內容 選單的內容選單上 開發人員指南

這些方法是這些介面唯一的內部內容物。如要定義其中一種方法 並處理事件、在活動中實作巢狀介面,或將其定義為匿名類別。 然後,將實作的執行個體傳送至 相應的 View.set...Listener() 方法。(例如: setOnClickListener() 並傳遞 OnClickListener 的實作內容)。

以下範例說明如何為按鈕註冊一個點擊事件監聽器。

Kotlin

protected void onCreate(savedValues: Bundle) {
    ...
    val button: Button = findViewById(R.id.corky)
    // Register the onClick listener with the implementation above
    button.setOnClickListener { view ->
        // do something when the button is clicked
    }
    ...
}

Java

// Create an anonymous implementation of OnClickListener
private OnClickListener corkyListener = 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(corkyListener);
    ...
}

此外,將「OnClickListener」實作為活動的一部分會更方便。 這可避免載入多餘的類別和配置多餘的物件。例如:

Kotlin

class ExampleActivity : Activity(), OnClickListener {
  
    protected fun onCreate(savedValues: Bundle) {
        val button: Button = findViewById(R.id.corky)
        button.setOnClickListener(this)
    }

    // Implement the OnClickListener callback
    fun onClick(v: View) {
        // do something when the button is clicked
    }
}

Java

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(): 這會傳回一個布林值,指出您是否已取用該事件,且不應繼續保留。 也就是說,傳回表示已經處理該事件,應就此停止; 如果尚未處理,且/或事件應繼續前往任何其他內容,則會傳回 false 點擊事件監聽器
  • onKey(): 這會傳回一個布林值,指出您是否已取用該事件,且不應繼續保留。 也就是說,傳回表示已經處理該事件,應就此停止; 如果尚未處理,且/或事件應繼續前往任何其他內容,則會傳回 false 按鍵事件監聽器
  • onTouch(): 這會傳回一個布林值,表示事件監聽器是否取用該事件。重點在於 此事件可能包含依序發生的多個動作。因此,如果您在 則代表未消耗該事件,且 對這個事件的後續操作不感興趣。因此您不會為了進行其他動作而被呼叫 ,例如手指手勢或最終的向上操作事件。

請注意,系統一律會將硬體按鍵事件傳送至目前焦點所在的檢視畫面。從頂端開始分派 向下移動,直到抵達適當的目的地為止。若您的資料檢視 (或子發布商) 目前有焦點,您可以透過 dispatchKeyEvent() 方法查看事件移動。除了透過檢視畫面擷取重要事件外,您也可以取得 透過 onKeyDown() 活動中的所有事件 和 onKeyUp()

此外,在考慮讓應用程式可輸入文字時,請記得許多裝置只有軟體輸入 方法。這類方法不一定要以金鑰為基礎;有些人可能會使用語音輸入、手寫等。即使 輸入法會顯示類似鍵盤的介面,但通常不會觸發 onKeyDown() 系列活動。無論如何 建構的使用者介面,除非您想限制應用程式只適用於裝置,否則使用者必須按下特定按鍵才能進行控制 取得實體鍵盤請特別注意,當使用者按下 傳回鍵;請改用 IME_ACTION_DONE 等動作 輸入法,應用程式可能會以有意義的方式變更使用者介面。避免假設 軟體輸入法的運作方式,只要信任它可為應用程式提供已格式化的文字即可。

注意:Android 會先呼叫事件處理常式,再呼叫適當的預設值 和回呼函式。因此,從這些事件監聽器傳回 true 時, 將事件傳播至其他事件接聽程式,也會封鎖對 預設事件處理常式因此,在傳回時請確認您的確想要終止事件。

事件處理常式

如果您是從檢視畫面建構自訂元件,就可以定義幾個回呼方法 做為預設事件處理常式 關於自訂的文件 檢視元件:您可以瞭解一些常用於事件處理的回呼。 包括:

您也應該瞭解其他方法,這些方法並不屬於 View 類別 但會直接影響您處理事件的方式因此,如果要在內部管理更複雜的事件 版面配置,請考慮以下其他方法:

觸控模式

使用者透過方向鍵或軌跡球瀏覽使用者介面時 以便將焦點移至可採取行動的項目 (例如按鈕), 可接受輸入的內容不過,裝置是否提供觸控功能 只要輕觸介面就能開始與介面互動,則不再需要 醒目顯示項目,或將焦點移至特定檢視畫面。因此 這類互動稱為「觸控模式」

如果是觸控式裝置,只要使用者輕觸螢幕,裝置就會 就會進入觸控模式。從現在起,只有哪些觀看次數 isFocusableInTouchMode() 為 true,例如文字編輯小工具。 其他可輕觸的檢視畫面 (例如按鈕) 輕觸時不會聚焦。他們將 只在按下時觸發其點擊事件監聽器。

使用者只要按下方向鍵或捲動軌跡球,裝置就會執行以下動作: 結束觸控模式,然後找到要聚焦的檢視畫面。現在,使用者可以繼續與使用者互動 操作介面

觸控模式狀態是由整個系統(所有視窗及活動)所維持。 如要查詢目前狀態,您可以呼叫 isInTouchMode()可查看裝置目前是否處於觸控模式。

處理焦點

該架構將根據使用者輸入內容處理例行焦點動作。 包括檢視畫面移除或隱藏時,變更焦點,或為新項目加上 可查看觀看次數。觀看次數表示他們願意專注觀看 透過 isFocusable() 方法傳遞物件如何變更檢視畫面可以 對焦,呼叫 setFocusable()。在觸控模式下 您可以查詢檢視畫面是否允許以 isFocusableInTouchMode() 聚焦。 如要變更此設定,請使用 setFocusableInTouchMode()

在搭載 Android 9 (API 級別 28) 以上版本的裝置中,活動不會指派 初期焦點。相對地,如有需要,您必須明確地要求起始焦點。

聚焦動作是根據演算法尋找 。在極少數情況下,預設演算法可能與 符合開發人員的預期行為在這些情況下,您可以 使用以下 XML 屬性在版面配置檔案中明確覆寫: nextFocusDownnextFocusLeftnextFocusRightnextFocusUp。將其中一個屬性加入來源的檢視畫面中 焦點就會消失將屬性值定義為檢視畫面的 ID 要聚焦的重點。例如:

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

一般來說,在這個垂直版面配置中,從第一個按鈕向上導覽不會觸發 也不會從第二個按鈕向下瀏覽。現在頂端的按鈕已包含 將底部控制項定義為 nextFocusUp (反之亦然),導覽焦點就會 是由上至下和由下而成為

如果您想在 UI 中將檢視畫面宣告為可聚焦元素 (傳統上並非如此), 在版面配置宣告中,將 android:focusable XML 屬性新增至檢視畫面。 設定 true 的值。您也可以宣告 在觸控模式中使用 android:focusableInTouchMode 時可聚焦。

如要要求特定檢視畫面接受聚焦,請呼叫 requestFocus()

如要監聽聚焦事件 (當檢視畫面收到或失去聚焦時通知),請使用 onFocusChange(), 方法請參閱「事件監聽器」一節。