軟鍵盤是用戶進行交互的重要途徑之一,同時軟鍵盤的彈出和收起,可能會影響到正在顯示的UI元素,影響用戶體驗,出現(xiàn)如下常見的軟鍵盤布局適配問題:
重要信息被軟鍵盤遮擋:當軟鍵盤彈出時,輸入框或其它重要UI元素可能會被鍵盤遮擋,導致用戶無法看到或訪問它們。
軟鍵盤彈出導致布局錯位:內(nèi)容可能會不恰當上移,影響用戶體驗。
軟鍵盤彈出導致彈窗過度上抬:彈窗被鍵盤上頂,造成不好的體驗。
針對以上問題,本文將幫助開發(fā)者了解軟鍵盤的彈出和收起的控制、避讓機制以及軟鍵盤常見問題的解決方法。
1、軟鍵盤的彈出收起和監(jiān)聽
用戶點擊輸入框時,軟鍵盤默認彈出。但在特定場景下,需要對軟鍵盤的彈出和收起進行控制,如點擊空白區(qū)域收起軟鍵盤,進入頁面時輸入框主動獲焦。開發(fā)者還需根據(jù)軟鍵盤狀態(tài)和高度調(diào)整頁面布局。
主動獲焦彈出軟鍵盤
有時候進入頁面,希望頁面中的輸入框能主動獲焦并且彈出軟鍵盤,方便用戶直接輸入,比如,點擊應用首頁的搜索框。這可以通過將輸入框的defaultFocus設置為true來實現(xiàn)。
TextInput() .defaultFocus(true)
代碼控制彈出軟鍵盤
開發(fā)者可以使用FocusController的requestFocus()方法,通過組件的id將焦點轉(zhuǎn)移到組件樹對應的實體節(jié)點,并且彈出軟鍵盤。例如,表情面板切換到文本輸入時,點擊表情圖標拉起系統(tǒng)軟鍵盤,便于用戶直接輸入。
TextInput({placeholder:'Please enter a contact name'}) .id('input1') Button('login') .onClick(() =>{ this.getUIContext().getFocusController().requestFocus('input1'); })
代碼控制收起軟鍵盤
通過全局的焦點控制對象FocusController的clearFocus方法,軟鍵盤收起,例如在下面的搜索頁面中,點擊搜索按鈕時軟鍵盤收起。
Button('Search') .onClick(() =>{ this.getUIContext().getFocusController().clearFocus(); })
此外,開發(fā)者可調(diào)用stopEditing()方法來關(guān)閉鍵盤,該方法需為輸入框單獨綁定一個TextInputController對象。在存在多個輸入框的場景下,需要綁定多個TextInputController對象,使用起來較為繁瑣,推薦改用clearFocus()方法來解除焦點。
@Component structStopEditingCpt{ privatecontroller:TextInputController=newTextInputController(); build() { Column() { TextInput({placeholder:'Input',controller:this.controller}) Button('Search') .onClick(() =>{ this.controller.stopEditing(); }) } } }
監(jiān)聽獲取軟鍵盤高度、鍵盤彈出和收起
開發(fā)者可以通過獲取軟鍵盤高度、監(jiān)聽軟鍵盤的彈出和收起狀態(tài),調(diào)整組件位置以適配界面或顯示隱藏某些組件。通過window模塊的on('keyboardHeightChange')方法開啟固定態(tài)軟鍵盤高度變化的監(jiān)聽,實時獲取軟鍵盤寬高。
aboutToAppear():void{ window.getLastWindow(this.getUIContext().getHostContext()).then(currentWindow=>{ currentWindow.on('keyboardHeightChange',(data:number) =>{ this.keyboardHeight=this.getUIContext().px2vp(data); }) }) }
監(jiān)聽獲取安全區(qū)域高度
window.getLastWindow(this.getUIContext().getHostContext()).then(curWindow => { curWindow.on('avoidAreaChange',data=> { if(data.area.bottomRect.height <=?0) { ? ? ? ? ??this.isKeyBoardHidden =?true; ? ? ? ? }?else?{ ? ? ? ? ??this.isKeyBoardHidden =?false; ? ? ? ? } ? ? ? }) ? ? })}
2、軟鍵盤避讓機制
默認避讓效果
解決軟鍵盤的界面適配問題,首先需要了解在HarmonyOS系統(tǒng)中軟鍵盤的避讓機制是怎么樣的。
如果當前輸入框不會被軟鍵盤遮擋,則不上抬組件,如圖所示點擊輸入框1,組件不會上抬。
當前輸入框會被軟鍵盤遮擋,則上抬組件至剛好在軟鍵盤上方顯示完整的輸入框,輸入框上方的組件會跟著抬起,下方的組件不會露出,如下方的輸入框12。
彈窗內(nèi)輸入框避讓規(guī)則
彈窗避讓可以通過BaseDialogOptions,設置彈窗的避讓模式KeyboradAvoidMode,當設置為默認避讓Default模式時,如果軟鍵盤彈出會覆蓋輸入框,彈窗整體會上抬,并且為了UX美觀,會存在默認的間隔,默認大小為16vp。
鍵盤避讓模式
當用戶在輸入時,為了確保輸入框不會被鍵盤遮擋,系統(tǒng)提供了避讓模式來解決這一問題。開發(fā)者可以通過setKeyboardAvoidMode控制虛擬鍵盤抬起時頁面的避讓模式,鍵盤抬起時默認頁面避讓模式為上抬模式,下面列舉了幾種常見的避讓模式。
1、上抬模式(KeyboardAvoidMode.OFFSET):為了避讓軟鍵盤,Page內(nèi)容會整體上抬。如下示例代碼,軟鍵盤彈出時,頁面整體上抬: 2、壓縮模式(KeyboardAvoidMode.RESIZE):當軟鍵盤高度改變時,調(diào)整Page大小。Page下設置百分比寬高的組件會跟隨壓縮,直接設置寬高的組件保持固定大小。注意,設置KeyboardAvoidMode.RESIZE時,安全區(qū)設置expandSafeArea 無效。 3、不避讓模式(KeyboardAvoidMode.NONE):軟鍵盤將直接覆蓋頁面UI,不會觸發(fā)界面布局調(diào)整。例如在全屏沉浸式場景(游戲/視頻播放器等),為保障用戶體驗的完整性,開發(fā)者可以使用KeyboardAvoidMode.NONE模式。 圖:壓縮模式,底部工具欄抬起
3、軟鍵盤避讓常見問題
重要信息被軟鍵盤遮擋
例如下面這個電子郵件示例,內(nèi)容包括標題欄、內(nèi)容區(qū)域和底部操作欄。點擊輸入內(nèi)容的輸入框時,軟鍵盤會遮擋底部操作欄,影響用戶體驗。這種情況只要設置避讓模式為壓縮模式即可。
aboutToAppear():void{ this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE); }
需要注意的是內(nèi)容區(qū)域高度的設置需要用百分比的方式實現(xiàn)
軟鍵盤彈出導致布局錯位
例如下面這樣的一個聊天界面,頂部是一個自定義的標題,下方為可滾動聊天消息區(qū)域,底部是消息輸入框。
想要頂部標題不被軟鍵盤向上抬,需要給標題組件設置
.expandSafeArea([SafeAreaType.KEYBOARD])屬性,使標題組件不避讓鍵盤。
軟鍵盤彈出導致彈窗過度上抬
當用戶點擊彈窗底部的輸入框的時候,彈窗會整體上抬,輸入框上抬的距離也過多。
為了解決以上問題,可以使用Navigation.Dialog,通過設置NavDestination的mode為NavDestinationMode.DIALOG彈窗類型,此時整個NavDestination默認透明顯示。同時,設置鍵盤避讓模式為壓縮模式KeyboardAvoidMode.RESIZE。
設置軟鍵盤和彈窗組件距離
彈窗類組件默認額避讓模式下,軟鍵盤彈起之后彈窗組件之間16vp間隔,開發(fā)者可以通過彈窗參數(shù)BaseDialogOptions中keyboardAvoidDistance,調(diào)整系統(tǒng)設置的避讓間距彈窗組件和軟鍵盤之間的距離。設置軟鍵盤間距時,需要將keyboardAvoidMode值設為KeyboardAvoidMode.DEFAULT。
-
開發(fā)者
+關(guān)注
關(guān)注
1文章
687瀏覽量
17843 -
軟鍵盤
+關(guān)注
關(guān)注
0文章
11瀏覽量
6514
原文標題:軟鍵盤布局適配指南
文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Labview寫軟鍵盤程序
英創(chuàng)WINCE工控主板軟鍵盤使用注意事項
Android軟鍵盤蓋住輸入框的解決方法
如何打開軟鍵盤 電腦的軟鍵盤怎么打開
請問如何在開發(fā)板中打開軟鍵盤?
HarmonyOS中軟鍵盤的獲取和關(guān)閉應該用那個類?
MiniGUI的軟鍵盤快速設計方法
軟鍵盤產(chǎn)品界面顯示的通用程序設計
軟鍵盤產(chǎn)品界面顯示的通用程序設計
英創(chuàng)信息技術(shù)WINCE工控主板軟鍵盤使用注意事項

評論