HarmonyOS 鸿蒙Next 自定义弹窗显示在页面底部键盘弹起导致内容上划问题

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 自定义弹窗显示在页面底部键盘弹起导致内容上划问题

自定义弹窗显示在页面底部,其中包含输入框。有内容输入时弹起键盘导致弹窗上划。 期望软键盘固定覆盖在弹窗布局上面,而不是将弹窗内容上顶。有没有解决办法? 

2 回复
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
  [@State](/user/State) message: string = 'CustomDialog中TextInput输入时,弹起键盘,整个弹窗内容被键盘挤上了。\n' +
    '期望页面固定,与键盘无关。帮忙看下这个问题怎么解决';
  [@State](/user/State) isShow:Boolean = false
  [@Builder](/user/Builder)
  BuildTop() {
    Row() {
      Row() {
        Image($r('app.media.dialog_ic_rank'))
          .objectFit(ImageFit.Contain)
          .height(23)
          .margin({ left: 6 })
          .onClick(() => {
          })
      }
      .width($r('app.float.default_63'))
      Text('设置')
        .fontSize($r('app.float.font_size_17'))
        .fontColor($r('app.color.col_101'))
      Row() {
        Button($r('app.string.set_finish'))
          .fontSize($r('app.float.font_size_14'))
          .backgroundColor($r('app.color.col_101'))
          .width($r('app.float.default_63'))
          .height(30)
      }
    }
    .width('100%')
    .justifyContent(FlexAlign.SpaceBetween)
    .alignItems(VerticalAlign.Center)
  }
  [@Builder](/user/Builder)
  BuildTextEditor() {
    Column() {
      this.BuilderCommonTitle($r('app.string.set_text_editor'))
      TextInput({
        text: '',
        placeholder: $r('app.string.set_text_editor_placeholder')
      })
        .caretColor($r('app.color.app_green'))//光标颜色
        .caretStyle({ width: 2 })//光标风格,宽度
        .borderRadius(10)
        .height(50)
        .textAlign(TextAlign.Center)
        .fontSize($r('app.float.font_size_17'))
        .fontColor($r('app.color.col_101'))
        .backgroundColor('#F6F7F9')
        .margin({ left: 7, top: 10, right: 9 })
        .onChange((value) => {
          // this.text = value
        })
    }
    .width('100%')
    .margin({ top: 17 })
    .alignItems(HorizontalAlign.Start)
  }
  [@Builder](/user/Builder)
  BuildSkin() {
    Column() {
      Text('皮肤列表区域')
    }
    .justifyContent(FlexAlign.Center)
    .width('100%')
    .height('40%')
    .margin({ top: 20 })
    .backgroundColor(Color.Gray)
  }
  [@Builder](/user/Builder)
  BuilderBottomPlayMode() {
    Column() {
      this.BuilderCommonTitle($r('app.string.set_play_mode'))
      Row() {
        Button($r('app.string.set_play_mode_manual'))
          .width(115)
          .height(45)
          .margin({ left: 10 })
          .fontColor($r('app.color.col_101'))
          .fontSize($r('app.float.font_size_14'))
          .borderRadius(10)
          .backgroundColor($r('app.color.app_green'))
          .onClick(() => {
          })
        Button($r('app.string.set_play_mode_auto'))
          .width(115)
          .height(45)
          .margin({ left: 12 })
          .fontSize($r('app.float.font_size_14'))
          .fontColor($r('app.color.col_101'))
          .borderRadius(10)
          .backgroundColor($r('app.color.app_green'))
          .onClick(() => {
          })
      }
      .margin({ top: 11 })
    }
    .width('100%')
    .margin({ top: 17 })
    .alignItems(HorizontalAlign.Start)
  }
  [@Builder](/user/Builder)
  BuilderCommonTitle(title: string | Resource) {
    Text(title)
      .fontColor($r('app.color.col_101'))
      .fontSize($r('app.float.font_size_14'))
  }
  [@Builder](/user/Builder) bindSheetModel() {
    Column() {
      this.BuildTop()
      Divider()
        .height(0.5)
        .backgroundColor($r('app.color.col_f5'))
        .margin({ top: 21, left: 4, right: 4 })
      this.BuildTextEditor()
      this.BuildSkin()
      this.BuilderBottomPlayMode()
    }
    .align(Alignment.End)
    .width('100%')
    .height('100%')
    .padding({ left: $r('app.float.default_16'), right: $r('app.float.default_16'), top: 21, bottom: 80 })
    .backgroundColor(Color.White)
    .borderRadius({ topLeft: $r('app.float.default_17'), topRight: $r('app.float.default_17') })
  }
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(16)}}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
自定义弹窗仅适用于简单提示场景,不能替代页面使用。由于弹窗存在完全避让输入法行为,即在软键盘弹出时,会自动向上抬起软键盘高度,因此如果弹窗高度过大时,可能会导致部分区域不可见。这是当前的规格
建议使用模态框实现

更多关于HarmonyOS 鸿蒙Next 自定义弹窗显示在页面底部键盘弹起导致内容上划问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙Next自定义弹窗显示在页面底部键盘弹起导致内容上划问题,以下是一些解决方案:

  1. 调整弹窗层级:确保自定义弹窗的层级设置正确,避免被其他元素覆盖,特别是当键盘弹出时。可以尝试调整弹窗的显示层级属性(如setZOrderOnTop),使其高于键盘和其他UI元素。
  2. 优化布局:检查自定义弹窗的布局文件,确保没有设置不必要的边距或对齐方式,这些可能导致弹窗内容被键盘遮挡。同时,确保弹窗的显示区域正确,没有被底部导航栏或其他元素所占用的区域所影响。
  3. 监听键盘状态:监听键盘的弹出和收起状态,动态调整弹窗的布局参数。当键盘弹出时,可以将弹窗内容向上移动以适应键盘高度,避免内容上划。
  4. 使用ScrollView:如果弹窗内容较多,可以使用ScrollView包裹内容,以便在键盘弹出时能够滚动查看被遮挡的部分。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部