使用者可以使用 Tab 鍵或方向 (箭頭 / D-pad) 鍵,在 UI 元素之間移動鍵盤焦點:
- Tab / Shift+Tab:在一維外觀順序中向前或向後移動焦點。
- 方向鍵:在二維空間中移動焦點 (上、下、左和右)。
單一維度焦點遍歷
在單向焦點遍歷中,Tab 鍵會根據畫面上的視覺外觀順序,在 UI 中推進焦點。
舉例來說,如果四個按鈕排列成列:
Column { Row { Button(onClick = { /* ... */ }) { Text("1st") } Button(onClick = { /* ... */ }) { Text("2nd") } } Row { Button(onClick = { /* ... */ }) { Text("3rd") } Button(onClick = { /* ... */ }) { Text("4th") } } }
按下 Tab 鍵後,焦點會依序在按鈕之間移動,順序如下:
- 第 1 個按鈕 (頂端開頭)
- 第 2 個按鈕 (頂端)
- 第 3 個按鈕 (底部開頭)
- 第 4 個按鈕 (底部)
在最後一個元素上按下 Tab 鍵,會回到第一個焦點目標。按下 Shift + Tab 鍵,焦點會反向移動。
二維焦點遍歷
按下鍵盤方向鍵或使用 D-Pad 會觸發二維焦點遍歷。
在二維遍歷中,系統會檢查 UI 元素的幾何座標和空間邊界,判斷指定方向上最接近的目標。
與使用 鍵的單向焦點遍歷功能不同,二維焦點遍歷功能不會循環。如果使用者在焦點位於最底部元素時按下向下鍵,焦點會停留在該元素上,而不會跳到畫面頂端。
使用指標點擊重設焦點周遊
在電腦或大螢幕裝置上切換實體鍵盤和滑鼠或觸控板時:
- 輕觸或點選時清除焦點:使用滑鼠或觸控板點選或輕觸非互動空間,即可釋放焦點。
- 重新開始遍歷:清除焦點後,下次按下 Tab 鍵時,系統會按照視覺外觀順序,從「第一個焦點目標」重新開始單一維度遍歷,而不是從先前啟用的元素繼續。這與二維焦點遍歷相同。方向鍵會將鍵盤焦點移至所選方向上最接近的焦點目標。
如要進一步瞭解如何透過程式輔助方式清除焦點,請參閱「移動及清除焦點」。
自訂焦點遍歷順序
您可以使用 focusProperties 修飾符自訂周遊行為。
自訂一維遍歷順序
如要覆寫一維周遊,請使用 FocusRequester 指定 next 或 previous 屬性:
- 使用
remember { FocusRequester() }建立FocusRequester物件。 - 使用
focusRequester修飾符將FocusRequester附加至目標可組合項。 - 將
focusProperties修飾符套用至來源可組合項,並將FocusRequester指派給next(適用於 Tab) 或previous(適用於 Shift+Tab)。
val (first, second, third) = remember { FocusRequester.createRefs() } Column { Button( onClick = { /* ... */ }, modifier = Modifier .focusRequester(first) .focusProperties { next = third } ) { Text("First (Tab jumps to Third)") } Button( onClick = { /* ... */ }, modifier = Modifier.focusRequester(second) ) { Text("Second") } Button( onClick = { /* ... */ }, modifier = Modifier.focusRequester(third) ) { Text("Third") } }
自訂二維遍歷順序
同樣地,您也可以在 focusProperties 中,將 FocusRequester 執行個體指派給 up、down、start、end、left 或 right,藉此覆寫二維焦點遍歷:
val (topButton, bottomButton) = remember { FocusRequester.createRefs() } Button( onClick = { /* ... */ }, modifier = Modifier .focusRequester(topButton) .focusProperties { down = bottomButton right = bottomButton } ) { Text("Top button") } Button( onClick = { /* ... */ }, modifier = Modifier.focusRequester(bottomButton) ) { Text("Bottom button") }
如要封鎖特定方向的焦點導覽 (例如在版面配置邊界),請將 FocusRequester.Cancel 指派給該屬性 (例如 down = FocusRequester.Cancel)。如要明確保留系統在特定方向的預設周遊演算法,請指派 FocusRequester.Default。