在 Windows 的應用中,我們常常爲了讓使用者能夠快速輸入,在Edit元件中的onKeyUp或者 onKeyDown 事件中主動偵測使用者輸入的字元是否有換行符號 (Enter),當使用者按下了Enter,程式碼就主動把遊標 Focus 帶到下個欄位,但在行動裝置中,又多了一個課題:『如果是多個欄位,就帶到下個欄位。但如果是單一欄位,或是最後一個欄位,就隱藏虛擬鍵盤』
這個課題筆者在 2014九月的筆記『Virtual Keyboard 的顯示與隱藏』裏面已經有介紹過一次,只是當時是聚焦在iOS系統上,因爲當時筆者開發的平臺大都聚焦在iOS,對Android系統的關切並不多。
最近在一些項目中,也把觸角伸到了Android平臺,但筆者仍堅持『不到最後關頭,絕不輕言JAVA』的原則,認識筆者的朋友們也都知道,筆者會寫,但非不得已,絕不寫JAVA的原則。
加上Delphi從XE6之後,對Android的支援也很深入了,筆者就更能堅定這個立場。
言歸正傳,在TEdit元件中要在使用者按下虛擬鍵盤的Enter鍵時,隱藏虛擬鍵盤的話,要怎麼做呢?
顯然用2014九月那個作法(把focus轉移到別的元件), 對Android平臺沒用,不然筆者也不用多寫這篇筆記了。
是的,熟習Android的使用者都知道,按下Android的實體Back鍵,就能隱藏虛擬鍵盤。所以這個作法也很簡單,就是『在onKeyUp事件中,把Key 改成 137 即可』
onKeyUp 事件中,有兩個 call by Reference 的參數,一個是 Key, 另一個是 KeyChar, 都讓我們可以在處理完鍵盤事件後,重新賦予新的值給系統。在Delphi Seattle, Berlin, Tokyo (前面的版本我已經移除了,無從驗證),這三個比較新的版本中,都定義有 vkHardwareBack這個值,其數值就是 137。
只需在 onKeyUp 事件中把 137 指派給 Key 這個變數即可隱藏鍵盤了,但通常我們程式碼可能會用於多種平臺上,所以我的範例程式代碼會加上 {$IFDEF Android} 這樣的判別式,以利多平臺的程式維護:
1
2
3
4
5
6
7
8
9
10
11
|
procedure TFormMain . Edit_changeDeviceNameKeyUp(Sender:
TObject; var Key: Word ; var KeyChar: Char ;
Shift: TShiftState); begin if Key
= vkReturn then begin self . btn1 . SetFocus; {$IFDEF
ANDROID} Key
:= vkHardwareBack { $ENDIF } end ; end ; |
這樣應該很容易理解,對嗎?