HarmonyOS 鸿蒙Next RelativeContainer布局,约束问题-组件不展示?

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

HarmonyOS 鸿蒙Next RelativeContainer布局,约束问题-组件不展示? 代码如下 :

想要实现的效果如图:约束【发布按钮】与左侧的【Text组件】是垂直居中的

在AlignDisStockReleaseButton变量中添加如下代码,即底部与左侧Text组件底部对齐,

但是会导致所有组件都不显示,请问是什么原因导致的?

cke_2715.png

@Entry
@Component
struct SnapshotExample {
  build() {

    RelativeContainer() {
      TextInput({ placeholder: '股林论股,畅所欲言~', text: '股林论股,畅所欲言~' })
        .id('disStockTextInput')
        .alignRules(AlignDisStockTextInput)
        .constraintSize({ maxWidth: '100%' })
        .margin({ top: 10, left: 16 })
        .fontSize(15)
        .fontColor($r('app.color.text_black_lv1'))

      Button('发布')
        .width(64)
        .height(30)
        .id('disStockReleaseButton')
        .alignRules(AlignDisStockReleaseButton)

      Row({ space: 10 }) {
        Text() {
          ImageSpan($r("app.media.publish_photo_icon")).width(16).aspectRatio(1)
          Span(' 图片').fontSize(14).fontColor($r('app.color.text_black_lv3'))
        }

        Text() {
          ImageSpan($r('app.media.publish_huati_icon')).width(16).aspectRatio(1)
          Span(' 话题').fontSize(14).fontColor($r('app.color.text_black_lv3'))
        }

        Text() {
          ImageSpan($r('app.media.publish_gupiao_icon')).width(16).aspectRatio(1)
          Span(' 股票').fontSize(14).fontColor($r('app.color.text_black_lv3'))
        }

        Text() {
          ImageSpan($r('app.media.publish_lianjie_icon')).width(16).aspectRatio(1)
          Span(' 链接').fontSize(14).fontColor($r('app.color.text_black_lv3'))
        }
      }
      .id('disStockRowRouter')
      .alignRules(AlignDisStockRowRouter)
      .margin({ left: 16 })

      Row() {
        Text('0/450')
      }
      .id('disTextNumLimit')
      .alignRules(AlignDisTextNumLimit)
    }
    .width('100%')
    .height(100)
    .backgroundColor('#c0c0c0')
  }
}

let AlignDisStockTextInput: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
  'top': { 'anchor': '__container__', 'align': VerticalAlign.Top },
  'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start },
  'right': { 'anchor': 'disStockReleaseButton', 'align': HorizontalAlign.Start }
}
let AlignDisStockReleaseButton: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
  'top': { 'anchor': '__container__', 'align': VerticalAlign.Top },
  'right': { 'anchor': '__container__', 'align': HorizontalAlign.End }
}
let AlignDisStockRowRouter: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
  'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Bottom },
  'bottom': { 'anchor': "__container__", 'align': VerticalAlign.Bottom },
  'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start }
}
let AlignDisTextNumLimit: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
  'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Bottom },
  'bottom': { 'anchor': "__container__", 'align': VerticalAlign.Bottom },
  'right': { 'anchor': '__container__', 'align': HorizontalAlign.End }
}

更多关于HarmonyOS 鸿蒙Next RelativeContainer布局,约束问题-组件不展示?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

这种解决办法不是很好,因为把按钮的宽高写死了,更好的话,我觉得可以换成Row布局

@Entry
@Component
struct SnapshotExample {
  build() {

    RelativeContainer() {
      TextInput({ placeholder: '股林论股,畅所欲言~', text: '股林论股,畅所欲言~' })
        .id('disStockTextInput')
        .alignRules(AlignDisStockTextInput)
        .margin({ top: 10, left: 16, right: 96 })
        .fontSize(15)
        .fontColor($r('app.color.text_black_lv1'))

      Button('发布')
        .width(64)
        .height(30)
        .margin({ left: 16 })
        .id('disStockReleaseButton')
        .alignRules(AlignDisStockReleaseButton)

      Row({ space: 10 }) {
        Text() {
          ImageSpan($r("app.media.publish_photo_icon")).width(16).aspectRatio(1)
          Span(' 图片').fontSize(14).fontColor($r('app.color.text_black_lv3'))
        }

        Text() {
          ImageSpan($r('app.media.publish_huati_icon')).width(16).aspectRatio(1)
          Span(' 话题').fontSize(14).fontColor($r('app.color.text_black_lv3'))
        }

        Text() {
          ImageSpan($r('app.media.publish_gupiao_icon')).width(16).aspectRatio(1)
          Span(' 股票').fontSize(14).fontColor($r('app.color.text_black_lv3'))
        }

        Text() {
          ImageSpan($r('app.media.publish_lianjie_icon')).width(16).aspectRatio(1)
          Span(' 链接').fontSize(14).fontColor($r('app.color.text_black_lv3'))
        }
      }
      .id('disStockRowRouter')
      .alignRules(AlignDisStockRowRouter)
      .margin({ left: 16 })

      Row() {
        Text('0/450')
      }
      .id('disTextNumLimit')
      .alignRules(AlignDisTextNumLimit)
    }
    .width('100%')
    .height(100)
    .backgroundColor('#c0c0c0')
  }
}

let AlignDisStockTextInput: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
  'top': { 'anchor': '__container__', 'align': VerticalAlign.Top },
  'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start },
}

let AlignDisStockReleaseButton: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
  'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Top },
  'bottom': { 'anchor': "disStockTextInput", 'align': VerticalAlign.Bottom },
  'left': { 'anchor': 'disStockTextInput', 'align': HorizontalAlign.End }
}

let AlignDisStockRowRouter: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
  'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Bottom },
  'bottom': { 'anchor': "__container__", 'align': VerticalAlign.Bottom },
  'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start }
}

let AlignDisTextNumLimit: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
  'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Bottom },
  'bottom': { 'anchor': "__container__", 'align': VerticalAlign.Bottom },
  'right': { 'anchor': '__container__', 'align': HorizontalAlign.End }
}

更多关于HarmonyOS 鸿蒙Next RelativeContainer布局,约束问题-组件不展示?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


非常感谢一位群友给的提示:

尝试注释掉一半子组件 二分查找法 判断出问题的点

底部的每个Text都需要设置id吧

是因为两个不固定尺寸的子组件 互相约束
解决办法是把AlignDisStockTextInput中的 ‘right’: { ‘anchor’: ‘disStockReleaseButton’, ‘align’: HorizontalAlign.Start }去掉,然后给TextInput组件一个右外边距,再去做按钮的约束,

受教了,

基本信息
姓名: 张三
职位: 软件工程师
技能: Python, Java, C++

经验
2018-2020: 公司A

  • 项目1: 描述
  • 项目2: 描述

2020-至今: 公司B

  • 项目3: 描述
  • 项目4: 描述

在HarmonyOS鸿蒙Next中,使用RelativeContainer布局时,若组件未展示,可能是由于约束条件设置不当导致的。RelativeContainer允许开发者通过相对定位的方式确定组件的位置,常见的约束属性包括alignRulesalignParentabovebelowtoLeftOftoRightOf等。

首先,确保组件的widthheight属性已正确设置,未设置或设置为0时,组件将无法显示。其次,检查alignRules是否正确配置。alignRules用于定义组件相对于其他组件或父容器的对齐方式,若未正确定义,组件可能被放置于可视区域之外。

例如,若组件A需要放置在组件B的下方,需在组件A的alignRules中设置above属性为组件B的ID。若组件B未正确设置或不存在,组件A将无法正确展示。此外,确保RelativeContainer的布局参数(如widthheight)未设置为wrap_content,这可能导致容器大小不足以容纳组件。

最后,检查组件的visibility属性,确保其未设置为GONE。若设置为GONE,组件将不可见且不占用布局空间。若以上条件均满足,组件仍不展示,建议检查布局层次结构,确保组件未被其他组件覆盖或遮挡。

总结,RelativeContainer布局中组件不展示的原因通常与约束条件、尺寸设置或可见性相关,需逐一排查并调整相关属性。

在HarmonyOS鸿蒙Next的RelativeContainer布局中,如果组件不展示,可能是以下原因导致的:

  1. 约束条件未正确设置:RelativeContainer布局依赖于组件间的约束关系,确保每个组件至少设置了alignRules属性,指定了与父容器或其他组件的对齐关系。

  2. 尺寸未定义:如果组件的宽度或高度未明确设置(如widthheight为0),组件将无法显示。确保组件设置了合适的尺寸或使用match_parent/wrap_content

  3. 层级覆盖:检查组件是否被其他组件遮挡或被父容器裁剪(如clip属性为true)。

  4. 布局未刷新:在动态更新约束后,确保调用invalidate()方法刷新布局。

通过检查以上问题,可以解决组件不展示的情况。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!