編寫:zhaochunqi - 原文:http://developer.android.com/training/keyboard-input/navigation.html

除了軟鍵盤輸入法(如虛擬鍵盤)以外,Android支持將物理鍵盤連接到設(shè)備上。鍵盤不僅方便輸入文本,而且提供一種方法來導(dǎo)航和與應(yīng)用交互。盡管多數(shù)的手持設(shè)備(如手機(jī))使用觸摸作為主要的交互方式,但是隨著平板和一些類似的設(shè)備正在逐步流行起來,許多用戶開始喜歡外接鍵盤。

隨著更多的Android設(shè)備提供這種體驗(yàn),優(yōu)化應(yīng)用以支持通過鍵盤與應(yīng)用進(jìn)行交互變得越來越重要。這節(jié)課介紹了怎樣為鍵盤導(dǎo)航提供更好的支持。

Note: 對(duì)那些沒有使用可見導(dǎo)航提示的應(yīng)用來說,在應(yīng)用中支持方向性的導(dǎo)航對(duì)于應(yīng)用的可用性也是很重要的。在我們的應(yīng)用中完全支持方向?qū)Ш竭€可以幫助我們使用諸如 uiautomator 等工具進(jìn)行自動(dòng)化用戶界面測試。

測試應(yīng)用

因?yàn)锳ndroid系統(tǒng)默認(rèn)開啟了大多必要的行為,所以用戶可能已經(jīng)可以在我們的應(yīng)用中使用鍵盤導(dǎo)航了。

所有由Android framework(如Button和EditText)提供的交互部件是可獲得焦點(diǎn)的。這意味著用戶可以使用如D-pad或鍵盤等控制設(shè)備,并且當(dāng)某個(gè)部件被選中時(shí),部件會(huì)發(fā)光或者改變外觀。

為了測試我們的應(yīng)用:

  1. 將應(yīng)用安裝到一個(gè)帶有實(shí)體鍵盤的設(shè)備上。

    如果我們沒有帶實(shí)體鍵盤的設(shè)備,連接一個(gè)藍(lán)牙鍵盤或者USB鍵盤(盡管并不是所有的設(shè)備都支持USB連接)

    我們還可以使用Android模擬器:

    1. 在AVD管理器中,要么點(diǎn)擊New Device,要么選擇一個(gè)已存在的文檔點(diǎn)擊Clone。

    2. 在出現(xiàn)的窗口中,確保KeyboardD-pad開啟。

  2. 為了驗(yàn)證我們的應(yīng)用,只是用Tab鍵來進(jìn)行UI導(dǎo)航,確保每一個(gè)UI控制的焦點(diǎn)與預(yù)期的一致。

    找到任何不在預(yù)期焦點(diǎn)的實(shí)例。

  3. 從頭開始,使用方向鍵(鍵盤上的箭頭鍵)來控制應(yīng)用的導(dǎo)航。

    在 UI 中每一個(gè)被選中的元素上,按上、下、左、右。

    找到每個(gè)不在預(yù)期焦點(diǎn)的實(shí)例。

如果我們找到任何使用Tab鍵或方向鍵后導(dǎo)航的效果不如預(yù)期的實(shí)例,那么在布局中指定焦點(diǎn)應(yīng)該聚焦在哪里,如下面幾部分所討論的。

處理Tab導(dǎo)航

當(dāng)用戶使用鍵盤上的Tab鍵導(dǎo)航我們的應(yīng)用時(shí),系統(tǒng)會(huì)根據(jù)組件在布局中的顯示順序,在組件之間傳遞焦點(diǎn)。如果我們使用相對(duì)布局(relative layout),例如,在屏幕上的組件順序與布局文件中組件的順序不一致,那么我們可能需要手動(dòng)指定焦點(diǎn)順序。

舉例來說,在下面的布局文件中,兩個(gè)對(duì)齊右邊的按鈕和一個(gè)對(duì)齊第二個(gè)按鈕左邊的文本框。為了把焦點(diǎn)從第一個(gè)按鈕傳遞到文本框,然后再傳遞到第二個(gè)按鈕,布局文件需要使用屬性 android:nextFocusForward,清楚地為每一個(gè)可被選中的組件定義焦點(diǎn)順序:

<RelativeLayout ...>
    <Button
        android:id="@+id/button1"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:nextFocusForward="@+id/editText1"
        ... />
    <Button
        android:id="@+id/button2"
        android:layout_below="@id/button1"
        android:nextFocusForward="@+id/button1"
        ... />
    <EditText
        android:id="@id/editText1"
        android:layout_alignBottom="@+id/button2"
        android:layout_toLeftOf="@id/button2"
        android:nextFocusForward="@+id/button2"
        ...  />
    ...
</RelativeLayout>

現(xiàn)在焦點(diǎn)從 button1 到 button2 再到 editText1,改成了按照在屏幕上出現(xiàn)的順序:從 button1 到 editText1 再到 button2。

處理方向?qū)Ш?/h2>

用戶也能夠使用鍵盤上的方向鍵在我們的app中導(dǎo)航(這種行為與在D-pad和軌跡球中的導(dǎo)航一致)。系統(tǒng)提供了一個(gè)最佳猜測:根據(jù)屏幕上 view 的布局,在給定的方向上,應(yīng)該將交掉放在哪個(gè) view 上。然而有時(shí),系統(tǒng)會(huì)猜測錯(cuò)誤。

當(dāng)在給定的方向進(jìn)行導(dǎo)航時(shí),如果系統(tǒng)沒有傳遞焦點(diǎn)給合適的 View,那么指定接收焦點(diǎn)的 view 來使用如下的屬性:

當(dāng)用戶導(dǎo)航到那個(gè)方向時(shí),每一個(gè)屬性指定了下一個(gè)接收焦點(diǎn)的 view,如根據(jù) view ID 來指定。舉例來說:

<Button
    android:id="@+id/button1"
    android:nextFocusRight="@+id/button2"
    android:nextFocusDown="@+id/editText1"
    ... />
<Button
    android:id="@id/button2"
    android:nextFocusLeft="@id/button1"
    android:nextFocusDown="@id/editText1"
    ... />
<EditText
    android:id="@id/editText1"
    android:nextFocusUp="@id/button1"
    ...  />


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)