文档管理中心
最佳实践功能开发应用框架输入法软键盘布局适配

软键盘布局适配

概述

软键盘是用户进行交互的重要途径之一,同时软键盘的弹出和收起,可能会影响到正在显示的UI元素,影响用户体验,出现如下常见的软键盘布局适配问题:

  • 重要信息被软键盘遮挡:当软键盘弹出时,输入框或其它重要UI元素可能会被键盘遮挡,导致用户无法看到或访问它们。
  • 软键盘弹出导致布局错位:内容可能会不恰当上移,影响用户体验。
  • 软键盘弹出导致弹窗过度上抬:弹窗被键盘上顶,造成不好的体验。

本文将介绍以下知识帮助开发者了解软键盘的弹出和收起的控制、避让机制以及软键盘常见问题的解决方法。

软键盘的弹出收起和监听

用户点击输入框时,软键盘默认弹出。但在特定场景下,需要对软键盘的弹出和收起进行控制,如点击空白区域收起软键盘,进入页面时输入框主动获焦。开发者还需根据软键盘状态和高度调整页面布局。

主动获焦弹出软键盘

有时候进入页面,希望页面中的输入框能主动获焦并且弹出软键盘,方便用户直接输入,例如,点击应用首页的搜索框,进入应用搜索页面。

可以通过将输入框的defaultFocus设置为true来实现。

收起
自动换行
深色代码主题
复制
  1. TextInput()
  2. .defaultFocus(true)

代码控制弹出软键盘

开发者可以使用FocusController的requestFocus()方法,通过组件的id将焦点转移到组件树对应的实体节点,并且弹出软键盘。例如,表情面板切换到文本输入时,点击表情图标拉起系统软键盘,便于用户直接输入。

示例如下:

收起
自动换行
深色代码主题
复制
  1. TextInput({ placeholder: 'Please enter a contact name' })
  2. .id('input1')
  3. Button('login')
  4. .onClick(() => {
  5. this.getUIContext().getFocusController().requestFocus('input1');
  6. })
注意

使用requestFocus需要保证TextInput组件已经挂载完成,应避免在组件未创建的情况下使用。

代码控制收起软键盘

通过全局的焦点控制对象FocusController的clearFocus()方法,软键盘收起,例如在下面的搜索页面中,点击搜索按钮时软键盘收起。

示例代码如下:

收起
自动换行
深色代码主题
复制
  1. Button('Search')
  2. .onClick(() => {
  3. this.getUIContext().getFocusController().clearFocus();
  4. })

此外,开发者可调用stopEditing()方法来关闭键盘,该方法需为输入框单独绑定一个TextInputController对象。在存在多个输入框的场景下,需要绑定多个TextInputController对象,使用起来较为繁琐,推荐改用clearFocus()方法来解除焦点。

收起
自动换行
深色代码主题
复制
  1. @Component
  2. struct StopEditingCpt {
  3. private controller: TextInputController = new TextInputController();
  4. build() {
  5. Column() {
  6. TextInput({ placeholder: 'Input', controller: this.controller })
  7. Button('Search')
  8. .onClick(() => {
  9. this.controller.stopEditing();
  10. })
  11. }
  12. }
  13. }

监听获取软键盘高度

开发者可以通过获取软键盘高度、监听软键盘的弹出和收起状态,调整组件位置以适配界面或显示隐藏某些组件。通过window模块的on('keyboardHeightChange')方法开启软键盘高度变化的监听,实时获取软键盘高度。例如下面这个示例软键盘弹起后显示表情栏,软键盘收起后隐藏表情栏。

上面效果图的实现示例代码如下,通过on('keyboardHeightChange')方法实时获取软键盘高度(返回值为整数,单位为px),并赋值给变量keyboardHeight。当keyboardHeight为0的时候表示软键盘处于收起状态,此时隐藏表情栏;keyboardHeight不为0的时候表示软键盘处于弹出状态,此时显示表情栏。

收起
自动换行
深色代码主题
复制
  1. import { window } from '@kit.ArkUI';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. @Entry
  5. @Component
  6. struct GetKeyboardHeightDemo {
  7. @State keyboardHeight: number = 0; // Soft keyboard height
  8. aboutToAppear(): void {
  9. try {
  10. window.getLastWindow(this.getUIContext().getHostContext()).then(currentWindow => {
  11. currentWindow.on('keyboardHeightChange', (data: number) => {
  12. this.keyboardHeight = this.getUIContext().px2vp(data);
  13. })
  14. })
  15. } catch (error) {
  16. let err = error as BusinessError;
  17. hilog.error(0x0000, 'GetKeyboardHeightDemo',
  18. `getLastWindow failed, error code=${err.code}, message=${err.message}`);
  19. }
  20. }
  21. build() {
  22. Column() {
  23. // ...
  24. TextInput()
  25. if (this.keyboardHeight > 0) {
  26. Row() { // Emoji
  27. // ...
  28. }
  29. // ...
  30. }
  31. }
  32. }
  33. }

监听获取安全区域高度

通过window模块的on('avoidAreaChange')方法开启当前窗口系统规避区变化的监听,获取内容可视区域大小,同时也可以监听软键盘的弹出收起。根据软键盘弹出后的可视区域大小,动态调整布局中组件的高度以适配界面。具体运用可以参考软键盘避让常见问题通过监听软键盘弹出,实现软键盘避让示例。

收起
自动换行
深色代码主题
复制
  1. import { KeyboardAvoidMode, window } from '@kit.ArkUI';
  2. import { UIAbility } from '@kit.AbilityKit';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. @Entry
  6. @Component
  7. struct GetSafeAreaHeightDemo {
  8. @State screenHeight: number = 0; // The height of the safe area
  9. @State isKeyBoardHidden: boolean = false; // Whether the soft keyboard is hidden
  10. aboutToAppear(): void {
  11. try {
  12. window.getLastWindow(this.getUIContext().getHostContext()).then(currentWindow => {
  13. let property = currentWindow.getWindowProperties();
  14. let avoidArea = currentWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_KEYBOARD);
  15. // Initialize the display area height
  16. this.screenHeight = this.getUIContext()
  17. .px2vp(property.windowRect.height - avoidArea.topRect.height - avoidArea.bottomRect.height);
  18. // Enables the monitoring of changes in the avoidance zone of the current window
  19. currentWindow.on('avoidAreaChange', data => {
  20. if (data.type !== window.AvoidAreaType.TYPE_KEYBOARD) {
  21. return;
  22. }
  23. if (data.area.bottomRect.height <= 0) {
  24. this.isKeyBoardHidden = true;
  25. } else {
  26. this.isKeyBoardHidden = false;
  27. }
  28. this.screenHeight = this.getUIContext()
  29. .px2vp(property.windowRect.height - data.area.topRect.height - data.area.bottomRect.height);
  30. hilog.info(0x0000, 'GetSafeAreaHeightDemo', `screen height is: ${this.screenHeight}`);
  31. })
  32. })
  33. } catch (error) {
  34. let err = error as BusinessError;
  35. hilog.error(0x0000, 'GetSafeAreaHeightDemo',
  36. `getLastWindow failed, error code=${err.code}, message=${err.message}`);
  37. }
  38. }
  39. build() {
  40. Column() {
  41. TextInput()
  42. }
  43. }
  44. }

软键盘避让机制

解决软键盘的界面适配问题,首先需要了解在HarmonyOS系统中软键盘的避让机制是怎么样的。

软键盘默认避让效果

为了确保输入框不被软键盘挡住,系统默认提供了输入框避让软键盘的能力,结合下面这个输入框列表,介绍软键盘避让的主要表现形式。

默认情况下,系统针对输入框位置,执行安全避让策略,保证输入框不会被软键盘遮挡:

  • 如果当前输入框不会被软键盘遮挡,则不上抬组件,如图所示点击输入框1,组件不会上抬。
  • 当前输入框会被软键盘遮挡,则上抬组件至刚好在软键盘上方显示完整的输入框,输入框上方的组件会跟着抬起,下方的组件不会露出。
表1 默认避让规格
展开

描述

  • 如果当前输入框不会被软键盘遮挡,则不上抬组件,如图所示点击输入框1,组件不会上抬。

如果当前输入框会被软键盘遮挡,则上抬组件至刚好在软键盘上方显示完整的输入框,输入框上方的组件会跟着抬起,下方的组件不会露出,可以看到输入框11下方的输入框12不会露出。

效果图

弹窗内输入框避让规则

弹窗避让可以通过BaseDialogOptions,设置弹窗的避让模式KeyboardAvoidMode,当设置为默认避让Default模式时,如果软键盘弹出会覆盖输入框,弹窗整体会上抬,并且为了UX美观,会存在默认的间隔,默认大小为16vp。

系统默认的软键盘避让形式仅能确保输入框不被遮挡,但输入框下方的组件可能会被软键盘遮挡。要解决此问题,需要了解软键盘的避让模式。

软键盘避让模式

当用户在输入时,为了确保输入框不会被键盘遮挡,系统提供了避让模式来解决这一问题。开发者可以通过setKeyboardAvoidMode控制虚拟键盘抬起时页面的避让模式,键盘抬起时默认页面避让模式为上抬模式,下面列举了几种常见的避让模式。

  • 上抬模式(KeyboardAvoidMode.OFFSET):为了避让软键盘,Page内容会整体上抬。如下示例代码,软键盘弹出时,页面整体上抬:
    收起
    自动换行
    深色代码主题
    复制
    1. import { KeyboardAvoidMode, window } from '@kit.ArkUI';
    2. import { UIAbility } from '@kit.AbilityKit';
    3. export default class EntryAbility extends UIAbility {
    4. onWindowStageCreate(windowStage: window.WindowStage): void {
    5. windowStage.loadContent('pages/GetSafeAreaHeightDemo', (err) => {
    6. // Lift up mode
    7. windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET);
    8. });
    9. }
    10. }

    示意效果如下,上抬整个页面实现软键盘避让:

  • 压缩模式(KeyboardAvoidMode.RESIZE):当软键盘高度改变时,调整Page大小。Page下设置百分比宽高的组件会跟随压缩,直接设置宽高的组件保持固定大小。设置KeyboardAvoidMode.RESIZE时,expandSafeArea([SafeAreaType.KEYBOARD],[SafeAreaEdge.BOTTOM])不生效。
    收起
    自动换行
    深色代码主题
    复制
    1. export default class EntryAbility extends UIAbility {
    2. onWindowStageCreate(windowStage: window.WindowStage): void {
    3. windowStage.loadContent('pages/GetSafeAreaHeightDemo', (err) => {
    4. // Compression mode
    5. windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE);
    6. });
    7. }
    8. }

    示意效果如下,通过压缩内容区域高度实现软键盘避让:

  • 不避让模式(KeyboardAvoidMode.NONE):软键盘将直接覆盖页面UI,不会触发界面布局调整。例如在全屏沉浸式场景(游戏/视频播放器等),为保障用户体验的完整性,开发者可以使用KeyboardAvoidMode.NONE模式。
    收起
    自动换行
    深色代码主题
    复制
    1. aboutToAppear(): void {
    2. this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.NONE);
    3. }

光标避让

上抬模式和压缩模式还包括KeyboardAvoidMode.OFFSET_WITH_CARET和KeyboardAvoidMode.RESIZE_WITH_CARET两种。当输入框的光标位置发生变化时,系统会自动触发相应的界面避让行为,确保光标始终处于可视区域内,具体可以参考光标避让

弹窗类组件避让模式

弹窗类组件(如Dialog、Popup、Menu、BindSheet等)避让模式有KeyboardAvoidMode.DEFAULT(避让)和KeyboardAvoidMode.NONE(不避让)两种,通过BaseDialogOptions中的keyboardAvoidMode属性,灵活控制是否避让软键盘。

若未指定弹窗避让模式,则其避让行为受页面避让模式影响。例如当通过setKeyboardAvoidMode()方法设置页面避让模式为KeyboardAvoidMode.NONE时,则弹窗也不会避让软键盘。

收起
自动换行
深色代码主题
复制
  1. this.getUIContext().getPromptAction().openCustomDialog({
  2. builder: () => {
  3. this.customDialogBuilder();
  4. },
  5. alignment: DialogAlignment.Bottom,
  6. width: '100%',
  7. // Set not avoid keyboard
  8. keyboardAvoidMode: KeyboardAvoidMode.NONE,
  9. });

设置组件不避让软键盘

前面介绍了避让模式,组件会为了避让软键盘而移动。有时希望组件不避让软键盘,例如在上抬模式下,希望顶部标题栏不移动。这种需求如何实现?这就需要了解安全区域expandSafeArea属性了。

通过expandSafeArea属性支持组件不改变布局情况下扩展其绘制区域至安全区外,当设置expandSafeArea属性type为SafeAreaType.KEYBOARD的时候,即expandSafeArea([SafeAreaType.KEYBOARD]),系统会将软键盘区域视作安全区,从而不会避让软键盘。如果开发者希望某些组件不避让软键盘,可以给组件设置expandSafeArea属性。组件避让软键盘的示例效果如下,软键盘弹出时页面整体上抬,自定义标题栏固定不动,具体实现可以参考软键盘弹出导致布局错位的示例。

软键盘避让常见问题

下面列举常见的软键盘适配问题,帮助开发者了解软键盘的适配方法。

重要信息被软键盘遮挡

例如下面这个电子邮件示例,内容包括标题栏、内容区域和底部操作栏。点击输入内容的输入框时,软键盘会遮挡底部操作栏,影响用户体验。具体如下图所示。

对应的示例代码如下,其中标题栏和底部操作栏都是固定的高度56,内容区域高度是非固定高度layoutWeight(1),自适应高度。

收起
自动换行
深色代码主题
复制
  1. @Component
  2. export struct MailPage {
  3. // ...
  4. build() {
  5. Column() {
  6. this.NavigationTitle()
  7. this.EmailContent()
  8. this.BottomToolbar()
  9. }
  10. // ...
  11. }
  12. @Builder
  13. NavigationTitle() {
  14. Row() {
  15. // ...
  16. }
  17. .width('100%')
  18. .height("56vp")
  19. // ...
  20. }
  21. @Builder
  22. BottomToolbar() {
  23. Row({ space: 12 }) {
  24. // ...
  25. }
  26. .width('100%')
  27. .height("56vp")
  28. // ...
  29. }
  30. @Builder
  31. EmailContent() {
  32. Column() {
  33. // ...
  34. }
  35. .width('100%')
  36. .layoutWeight(1)
  37. // ...
  38. }
  39. }

开发者可以通过设置软键盘的避让模式为KeyboardAvoidMode.RESIZE(压缩模式),来解决底部操作栏被遮挡的问题,设置该属性后,软键盘的避让会通过压缩内容区域的高度来实现。示例代码如下:

收起
自动换行
深色代码主题
复制
  1. aboutToAppear(): void {
  2. this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE);
  3. }
  4. aboutToDisappear(): void {
  5. this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET);
  6. }

需要注意的是内容区域高度的设置需要用百分比的方式实现,效果图如下:

通过监听软键盘弹出,实现软键盘避让

上面这个示例开发者还可以通过window模块的getWindowAvoidArea方法,监听获取软键盘弹出,获取安全显示区域高度动态设置页面高度。示例代码如下:

收起
自动换行
深色代码主题
复制
  1. import { CommonConstants as Const } from '../common/constants/CommonConstants';
  2. import { window } from '@kit.ArkUI';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. @Entry
  6. @Component
  7. struct MailHomePage2 {
  8. @State message: string = 'Hello World';
  9. @State screenHeight: number = 0;
  10. @State isKeyBoardHidden: boolean = false;
  11. aboutToAppear(): void {
  12. try {
  13. window.getLastWindow(this.getUIContext().getHostContext()).then(currentWindow => {
  14. let property = currentWindow.getWindowProperties();
  15. let avoidArea = currentWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
  16. // Initialize the display area height
  17. this.screenHeight = this.getUIContext().px2vp(property.windowRect.height - avoidArea.topRect.height - avoidArea.bottomRect.height);
  18. // Monitor the ejection and retraction of the soft keyboard
  19. currentWindow.on('avoidAreaChange', async data => {
  20. if (data.type !== window.AvoidAreaType.TYPE_KEYBOARD) {
  21. return;
  22. }
  23. if (data.area.bottomRect.height <= 0) {
  24. this.isKeyBoardHidden = true;
  25. } else {
  26. this.isKeyBoardHidden = false;
  27. }
  28. this.screenHeight = this.getUIContext().px2vp(property.windowRect.height - avoidArea.topRect.height - data.area.bottomRect.height);
  29. })
  30. })
  31. } catch (error) {
  32. let err = error as BusinessError;
  33. hilog.error(0x0000, 'MailHomePage2', `getLastWindow failed, error code=${err.code}, message=${err.message}`);
  34. }
  35. }
  36. build() {
  37. Column() {
  38. this.NavigationTitle()
  39. this.EmailContent()
  40. this.BottomToolbar()
  41. }
  42. .width('100%')
  43. .height(this.screenHeight) // Dynamically sets the viewport height
  44. .expandSafeArea([SafeAreaType.KEYBOARD])
  45. .backgroundColor('#F1F3F5')
  46. }
  47. // ...
  48. }

当系统的避让机制无法满足开发者需求时,开发者可以监听软键盘弹出,根据获取的安全区域或软键盘高度,调整布局大小和位置以避让软键盘。

软键盘弹出导致布局错位

内容向上滚动避让,顶部固定

例如下面这样的一个聊天界面,顶部是一个自定义的标题,下方为可滚动聊天消息区域,底部是消息输入框,示例代码如下:

收起
自动换行
深色代码主题
复制
  1. @Entry
  2. @Component
  3. export struct ContactPage {
  4. // ...
  5. build() {
  6. Row() {
  7. Column() {
  8. Row() {
  9. // ...
  10. }
  11. // ...
  12. .height('12%')
  13. // ...
  14. .expandSafeArea([SafeAreaType.KEYBOARD])
  15. .zIndex(1)
  16. // ...
  17. List() {
  18. // ...
  19. }
  20. .height('76%')
  21. // ...
  22. Column() {
  23. // ...
  24. }
  25. .height('12%')
  26. // ...
  27. }
  28. .width('100%')
  29. // ...
  30. }
  31. .height('100%')
  32. }
  33. }

由于软键盘避让默认为上抬模式,会将整个页面向上抬起,因此标题也会被顶上去,如图所示。

现在需求是希望顶部标题固定,点击底部输入框软键盘弹起的时候,标题不上抬,只有内容区域上抬。效果图如下:

想要顶部标题不被软键盘向上抬,需要给对应的组件设置 .expandSafeArea([SafeAreaType.KEYBOARD])属性,使标题组件不避让键盘,示例代码如下:

收起
自动换行
深色代码主题
复制
  1. @Entry
  2. @Component
  3. export struct ContactPage {
  4. // ...
  5. build() {
  6. Row() {
  7. Column() {
  8. Row() {
  9. // ...
  10. }
  11. // ...
  12. .height('12%')
  13. // ...
  14. .expandSafeArea([SafeAreaType.KEYBOARD])
  15. .zIndex(1)
  16. // ...
  17. List() {
  18. // ...
  19. }
  20. .height('76%')
  21. // ...
  22. Column() {
  23. // ...
  24. }
  25. .height('12%')
  26. // ...
  27. }
  28. .width('100%')
  29. // ...
  30. }
  31. .height('100%')
  32. }
  33. }

具体实现可以参考Sample代码Keyboard

软键盘弹出导致弹窗过度上抬

自定义弹窗被键盘顶起 ,影响用户体验

在软键盘系统避让机制中介绍过,弹窗为避让软键盘会整体向上抬,这样可能会影响用户体验。比如下面这个评论列表的弹窗,使用@CustomDialog实现的,示例代码如下:

收起
自动换行
深色代码主题
复制
  1. @CustomDialog
  2. struct CommentDialog {
  3. listData: string[] = ['comments1', 'comments2', 'comments3', 'comments4', 'comments5', 'comments6', 'comments7', 'comments8'];
  4. controller?: CustomDialogController;
  5. build() {
  6. Column() {
  7. Text('comments')
  8. .fontSize(20)
  9. .fontWeight(FontWeight.Medium)
  10. List() {
  11. ForEach(this.listData, (item: string) => {
  12. ListItem() {
  13. Text(item)
  14. .height(80)
  15. .fontSize(20)
  16. }
  17. }, (item: string) => item)
  18. }
  19. .scrollBar(BarState.Off)
  20. .width('100%')
  21. .layoutWeight(1)
  22. TextInput({ placeholder: 'Please input content' })
  23. .height(40)
  24. .width('100%')
  25. }
  26. .padding(12)
  27. }
  28. }
  29. @Entry
  30. @Component
  31. struct CustomDialogDemo {
  32. dialogController: CustomDialogController | null = new CustomDialogController({
  33. builder: CommentDialog(),
  34. alignment: DialogAlignment.Bottom,
  35. cornerRadius: 0,
  36. width: '100%',
  37. height: '80%'
  38. })
  39. build() {
  40. Column() {
  41. Button('click me')
  42. .onClick(() => {
  43. if (this.dialogController !== null) {
  44. this.dialogController.open();
  45. }
  46. })
  47. }
  48. .height('100%')
  49. .width('100%')
  50. .justifyContent(FlexAlign.Center)
  51. }
  52. }

当用户点击弹窗底部的输入框的时候,弹窗会整体上抬,输入框上抬的距离也过多。

为了解决以上问题,可以通过设置NavDestination的mode为NavDestinationMode.DIALOG弹窗类型,此时整个NavDestination默认透明显示,示例代码如下:

收起
自动换行
深色代码主题
复制
  1. @Entry
  2. @Component
  3. struct NavDestinationModeDemo {
  4. @Provide('NavPathStack') pageStack: NavPathStack = new NavPathStack()
  5. @Builder
  6. PagesMap(name: string) {
  7. if (name === 'DialogPage') {
  8. DialogPage()
  9. }
  10. }
  11. build() {
  12. Navigation(this.pageStack) {
  13. Column() {
  14. Button('click me')
  15. .onClick(() => {
  16. this.pageStack.pushPathByName('DialogPage', '');
  17. })
  18. }
  19. .height('100%')
  20. .width('100%')
  21. .justifyContent(FlexAlign.Center)
  22. }
  23. .mode(NavigationMode.Stack)
  24. .navDestination(this.PagesMap)
  25. }
  26. }
  27. @Component
  28. export struct DialogPage {
  29. @Consume('NavPathStack') pageStack: NavPathStack;
  30. listData: string[] = ['评论1', '评论2', '评论3', '评论4', '评论5', '评论6', '评论7', '评论8'];
  31. build() {
  32. NavDestination() {
  33. Stack({ alignContent: Alignment.Bottom }) {
  34. Column() {
  35. Text('评论')
  36. .fontSize(20)
  37. .fontWeight(FontWeight.Medium)
  38. List() {
  39. ForEach(this.listData, (item: string) => {
  40. ListItem() {
  41. Text(item)
  42. .height(80)
  43. .fontSize(20)
  44. }
  45. }, (item: string) => item)
  46. }
  47. .scrollBar(BarState.Off)
  48. .width('100%')
  49. .layoutWeight(1)
  50. TextInput({ placeholder: 'Please input content' })
  51. .height(40)
  52. .width('100%')
  53. }
  54. .backgroundColor(Color.White)
  55. .height('75%')
  56. .width('100%')
  57. .padding(12)
  58. }
  59. .height('100%')
  60. .width('100%')
  61. }
  62. .backgroundColor('rgba(0,0,0,0.2)')
  63. .hideTitleBar(true)
  64. .mode(NavDestinationMode.DIALOG)
  65. }
  66. }

还需设置软键盘避让模式为压缩模式,示例代码如下:

收起
自动换行
深色代码主题
复制
  1. import { UIAbility } from "@kit.AbilityKit";
  2. import { window, KeyboardAvoidMode } from "@kit.ArkUI";
  3. export default class EntryAbility extends UIAbility {
  4. onWindowStageCreate(windowStage: window.WindowStage): void {
  5. windowStage.loadContent('pages/GetSafeAreaHeightDemo', (err) => {
  6. // Compression mode
  7. windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE);
  8. });
  9. }
  10. }

运行效果如下,点击输入框后,内容区域会进行压缩,弹窗整体不会发生上抬。

关于评论回复场景的实现,可以参考:评论回复弹窗

设置软键盘和弹窗组件距离

弹窗类组件默认避让模式下,软键盘弹起之后弹窗组件之间16vp间隔,开发者可以通过弹窗参数BaseDialogOptions中keyboardAvoidDistance,调整弹窗组件与软键盘之间的避让距离。设置软键盘间距时,需要将keyboardAvoidMode值设为KeyboardAvoidMode.DEFAULT。

收起
自动换行
深色代码主题
复制
  1. this.getUIContext().getPromptAction().openCustomDialog({
  2. builder: () => {
  3. this.customDialogBuilder();
  4. },
  5. alignment: DialogAlignment.Bottom,
  6. width: '100%',
  7. // Set the distance between the soft keyboard and custom dialog to 0
  8. keyboardAvoidDistance:LengthMetrics.vp(0)
  9. });

Web组件内容输入框

针对由Web组件内容输入组件拉起软键盘以及避让软键盘的内容,可以参考:Web组件对接软键盘