HarmonyOS鸿蒙Next中textarea在屏幕底部时输入内容,输入到第三行的内容会被软键盘遮挡,怎么实现输入内容不被软键盘遮挡且UI不变

HarmonyOS鸿蒙Next中textarea在屏幕底部时输入内容,输入到第三行的内容会被软键盘遮挡,怎么实现输入内容不被软键盘遮挡且UI不变呢?

@Entry
@ComponentV2
export struct Index {
  @Param newsContent: string = "";
  controller: TextAreaController = new TextAreaController();

  build() {
    Column() {
      Text('ceshi')
        .margin({ bottom: 550 })
      TextArea({ placeholder: "测试内容", text: $$this.newsContent })
        .borderRadius(10)
        .border({ width: 1, color: "#eeeeee" })
        .placeholderColor("#cccccc")
        .fontSize(14)
        .height(120)
        .maxLength(60)
        .showCounter(true);

    }
    .width("100%")

  }
}

更多关于HarmonyOS鸿蒙Next中textarea在屏幕底部时输入内容,输入到第三行的内容会被软键盘遮挡,怎么实现输入内容不被软键盘遮挡且UI不变的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

【背景知识】

软键盘避让模式:当用户在输入时,为了确保输入框不会被键盘遮挡,系统提供了避让模式来解决这一问题。可以通过setKeyboardAvoidMode控制虚拟键盘抬起时页面的避让模式,键盘抬起时页面避让模式可分为上抬模式、压缩模式,默认采用上抬模式。

安全区域:安全区域是指页面的显示区域,默认不与系统设置的非安全区域比如状态栏、导航栏区域重叠,默认情况下开发者开发的界面都被布局在安全区域内。

【解决方案】

  • 若想在多个输入框中切换时触发键盘避让(输入框光标位置发生变化时候也会触发)可以设置键盘避让模式为OFFSET_WITH_CARETRESIZE_WITH_CARET,可以根据需要选择使用OFFSET或RESIZE模式。示例代码如下:
// src/main/ets/pages/MailPage.ets
import { KeyboardAvoidMode } from '@kit.ArkUI';
aboutToAppear(): void {
  // 根据需要选择合适的避让模式
  this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET_WITH_CARET)
  // this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE_WITH_CARET)
}
  • 若重要信息被软键盘遮挡(如底部操作栏被遮挡),可以设置软键盘的避让模式为KeyboardAvoidMode.RESIZE(压缩模式),压缩内容区域的高度,示例代码如下:
// src/main/ets/pages/MailPage.ets
aboutToAppear(): void {
  this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE);
}

aboutToDisappear(): void {
  this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET);
}
  • 若软键盘弹出导致布局错位(如顶部标题被软键盘向上抬),需要给对应的组件设置.expandSafeArea([SafeAreaType.KEYBOARD])属性,使标题组件不避让键盘,示例代码如下:
@Component
export struct ContactPage {
  // ...
  build() {
    Row() {
      Column() {
        Row() { // 顶部自定义标题栏
          // ...
        }
        .height('12%')
        .expandSafeArea([SafeAreaType.KEYBOARD]) // 控制组件扩展其安全区域
        .zIndex(1)
        // ...

        List() { // 聊天消息区域
          // ...
        }
        .height('76%')
        // ...

        Column(){ // 底部消息输入框
          // ...
        }
        .height('12%')
        // ...
      }
      .width('100%')
      // ...
    }
    .height('100%')
  }
}
  • 若软键盘弹出导致弹窗过度上抬(如自定义弹窗被键盘顶起),可以使用Navigation.Dialog,通过设置NavDestination的mode为NavDestinationMode.DIALOG弹窗类型,此外还需要设置软键盘避让模式为压缩模式,可参考自定义弹窗被键盘顶起。示例代码如下:
@Component
export struct DialogPage {
@Consume('NavPathStack') pageStack: NavPathStack;

build() {
  NavDestination() {
    Stack({ alignContent: Alignment.Center }) {
      Column() {
        Text("Dialog NavDestination")
          .fontSize(20)
          .margin({ bottom: 100 })
        Button("Close").onClick(() => {
          this.pageStack.pop()
        }).width('30%')
      }
    }.height("100%").width('100%')
  }
  .mode(NavDestinationMode.DIALOG) // 设置NavDestination的mode为DIALOG
}

更多关于HarmonyOS鸿蒙Next中textarea在屏幕底部时输入内容,输入到第三行的内容会被软键盘遮挡,怎么实现输入内容不被软键盘遮挡且UI不变的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,可以通过设置WindowInsets监听软键盘的显示状态,动态调整TextArea的布局位置。使用WindowInsets.getSystemWindowInsetsBottom()获取软键盘高度,然后通过TextArea.setPadding()TextArea.setTranslationY()调整TextArea的位置,确保内容不被遮挡。同时,使用WindowInsetsAnimation实现平滑过渡,保持UI不变。

在HarmonyOS Next中解决TextArea被软键盘遮挡的问题,可以通过以下方式实现:

  1. 使用windowSoftInputMode属性调整窗口布局:
import window from '@ohos.window';

// 在onPageShow生命周期中设置
onPageShow() {
  let windowClass = window.getLastWindow(this.context);
  windowClass.setWindowSoftInputMode(window.SoftInputMode.ADJUST_RESIZE);
}
  1. 使用Scroll组件包裹内容区域:
build() {
  Scroll() {
    Column() {
      Text('ceshi')
        .margin({ bottom: 550 })
      TextArea({ placeholder: "测试内容", text: $$this.newsContent })
        .borderRadius(10)
        .border({ width: 1, color: "#eeeeee" })
        .placeholderColor("#cccccc")
        .fontSize(14)
        .height(120)
        .maxLength(60)
        .showCounter(true)
    }
    .width("100%")
  }
  .scrollable(ScrollDirection.Vertical)
}
  1. 或者使用Flex布局+Column的alignItems属性:
build() {
  Column() {
    Text('ceshi')
      .margin({ bottom: 550 })
    TextArea({ placeholder: "测试内容", text: $$this.newsContent })
      // ...其他样式设置
      .layoutWeight(1)  // 关键属性
  }
  .width("100%")
  .height("100%")
  .alignItems(HorizontalAlign.Start)
}

这些方案都能确保软键盘弹出时界面自动调整,不会遮挡输入内容,同时保持原有UI布局不变。选择哪种方案取决于你的具体布局需求。

回到顶部